嗨,我有以下一段代码-
class A{
public:
A(){
cout << "In A CTR" << endl;
}
virtual void buildTree() = 0;
void print(){
cout << "int A print This = " << this << endl;
}
};
class B{
public:
B(){
cout << "In B CTR" << endl;
}
virtual A* getBuilder() {
cout << " In B getBuilder , this = " << this << endl;
return NULL;
}
virtual void hell(){
cout << "In B hell This =" << this << endl;
}
void print(){
cout << "in B print This = " << this << endl;
}
B* add(B* child){
cout << "In B add , This = " << this <<endl;
}
};
class C : public A, public B{
public:
C(){
cout << "In C CTR" << endl;
}
A* getBuilder() {
cout << "In C getBuilder , this = " << this << endl;
return this;
}
void print(){
cout << "In C print This = " << this << endl;
}
};
class D : public C{
public:
D(){
cout <<"In D CTR" << endl;
}
void buildTree(){
cout << "buildTree in D , This = " << this << endl;
B *b = NULL;
add(b);
}
void print(){
cout << "In D print This = " << this << endl;
}
};
int main() {
B *root = new D();
root->getBuilder()->buildTree();
return 0;
}
我得到以下输出:
在C getBuilder中,
this = 0x7f9aa0500100
D中的buildTree
this = 0x7f9aa0500100
在B中,添加
this = 0x7f9aa0500108
我不知道为什么
add()
中的class B
被调用。这是我的理解。请纠正我。root
是类型为B
的指针,并指向D
。因此,当调用
root->getBuilder()
时,它将调用class C
中的虚函数,该虚函数返回类型为A*
的指针。因此,现在
root->getBuilder()
返回一个指向D的类型A的指针。因此
root->getBuilder()->buildTree()
能够在D中调用buildTree。但是在
class D
的buildTree中,我们调用的是class B
中定义的add。我们如何称呼它,因为指针类型是
A
并且对B
函数一无所知。任何帮助表示赞赏。
谢谢
最佳答案
这似乎是一个问题:
但是在类D的buildTree中,我们正在调用定义的add
在B类中。由于指针类型为A,我们如何调用此方法
并且不应该对B函数一无所知。
在buildTree
标记为虚拟的指针类型为A*
的情况下调用buildTree
将在给定D*
类型为root
的D
上调用buildTree。因此add
可用于D
,因为D
可以访问is超类的公共和受保护的方法。
原始代码示例不必要地复杂。可以通过以下代码检查相同的原理:
A *root = new D();
root->buildTree();
关于c++ - 虚拟函数C++中的类转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48686669/