Base X::*
означает указатель на элемент X, имеющий тип Base.
Это не то же самое, как
Base*
Там нет преобразования из
Base*
к
Base X::*
и, следовательно, никакого преобразования из
Derived*
к
Base X::*
Точно так же нет преобразования между Base X::*
и Derived X::*
Пример:
#include <iostream>
using namespace std;
class Base
{
};
class Derived : public Base
{
};
class X {
public:
Derived field1;
Base field2;
};
int main() {
Base X::* ptr1 = &X::field1; // Derived X::* to Base X::* OK ?
Derived X::* ptr2 = &X::field2; // Base X::* to Derived X::* OK ?
return 0;
}
Это приведет к
prog.cpp:20:28: error: invalid conversion from 'Derived X::*' to 'Base X::*' [-fpermissive]
Base X::* ptr1 = &X::field1;
^
prog.cpp:21:31: error: invalid conversion from 'Base X::*' to 'Derived X::*' [-fpermissive]
Derived X::* ptr2 = &X::field2;
Так что для того, чтобы compil е, он должен быть:
int main() {
Derived X::* ptr1 = &X::field1;
Base X::* ptr2 = &X::field2;
return 0;
}
Ниже приведен пример того, как можно использовать указатель на член:
#include <iostream>
#include <vector>
using namespace std;
class Base
{
public:
Base(int g1) : g(g1) {}
int g;
};
class Derived : public Base
{
public:
Derived(int d) : Base(d) {}
};
class X {
public:
X(int f1, int f2) : field1(f1), field2(f2) {}
Derived field1;
Derived field2;
};
void foo(vector<X>& vx, Derived X::*d)
{
cout << "foo" << endl;
for (auto& x : vx)
{
cout << (x.*d).g << endl;
}
}
int main() {
vector<X> vx {{5, 10}, {50, 100}};
foo(vx, &X::field1); // Print field1.g of all elements in vector vx
foo(vx, &X::field2); // Print field2.g of all elements in vector vx
return 0;
}
Этот выход:
foo
5
50
foo
10
100
не очень.OP не пытается «назначить« указатель на вещь в классе B »объекту типа« указатель на вещь в классе A. »Оба указателя являются указателями на« вещь в классе X ». Просто разных типов. – SergeyA
Я не уверен, что я понимаю ваш ответ. Я пытаюсь преобразовать 'Derived' в' Base' указатель в классе 'X'. –
@AndreiKouznetsov, см. Мой ответ. Они не конвертируются, поскольку они являются указателями на членов . – SergeyA