![](/img/trans.png)
[英]C++ call via pointer-to-member function in a derived class from the base class
[英]Pointer-to-Member invalid conversion from ‘Derived X::*’ to ‘Base X::*’
我想知道為什么在指向成員轉換的情況下,從派生類指針到基類指針的簡單轉換會失敗。 例如,
struct Base {};
struct Derived: public Base {};
struct X {
Derived field;
};
int main(int argc, char *argv[]) {
Base X::* ptr1 = &X::field;
return 0;
}
給出錯誤:
$ g++ t.cc
t.cc: In function ‘int main(int, char**)’:
t.cc:9:24: error: invalid conversion from ‘Derived X::*’ to ‘Base X::*’ [-fpermissive]
Base X::* ptr1 = &X::field;
^
因為兩者之間沒有有意義的轉換。
您試圖將“指向B類中的事物的指針”分配給類型為“指向A類中的事物的指針”的對象。
這兩個類之間的繼承關系與此無關 - 類A根本不包含您想要指向的事物。 類型系統正在發揮作用。
你必須找到一些其他方法來做你正在嘗試做的事情。 不幸的是你沒有說那是什么,所以我無法進一步幫助!
這是對的。 使用指向成員的指針時,不能使用指向base的指針來標識派生類。 指向成員的指針不是指針! :)
Base X::*
表示指向具有Base類型的X成員的指針。
它不一樣
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;
所以為了編譯,它需要是:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.