嗨,我有以下一段代码-

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*类型为rootD上调用buildTree。因此add可用于D,因为D可以访问is超类的公共和受保护的方法。

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

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

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

10-08 22:54