gpt4 book ai didi

c++ - 虚函数中的类转换 C++

转载 作者:行者123 更新时间:2023-11-28 01:37:22 25 4
gpt4 key购买 nike

您好,我有以下一段代码 -

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

我无法弄清楚为什么 class B 中的 add() 被调用。这是我的理解。请指正。

rootB 类型的指针,指向 D 。因此,当 root->getBuilder() 被调用时,它会调用 class C 中的虚函数,它返回一个类型为 A* 的指针.

所以,现在 root->getBuilder() 返回一个指向 D 的类型 A 的指针。因此 root->getBuilder()->buildTree() 能够在 D 中调用 buildTree。

但是在 class D 的 buildTree 中,我们正在调用在 class B 中定义的 add。我们如何调用它,因为指针类型是 A 并且不应该对 B 函数一无所知。

感谢任何帮助。

谢谢

最佳答案

这似乎是问题:

But in the buildTree in class D , we are calling add which is defined in class B. How are we able to call this , as the pointer type is A and should not know nothing about B, functions.

A* 指针类型上调用 buildTree,其中 buildTree 被标记为虚拟,将在 D 上调用 buildTree * 给定的 rootD 类型。所以 addD 可用,因为 D 可以访问 is 父类(super class)的公共(public)和 protected 方法。

原始代码示例不必要地复杂。可以通过以下代码检查相同的原理:

A *root = new D();
root->buildTree();

关于c++ - 虚函数中的类转换 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48686669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com