C++ 虚拟函数c+中的类强制转换+;

C++ 虚拟函数c+中的类强制转换+;,c++,C++,嗨,我有下面的代码- 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:

嗨,我有下面的代码-

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;
}
A类{
公众:
(){

这似乎是个问题:

但是在类D中的构建树中,我们调用了定义为 在B类中,我们如何调用它,因为指针类型是A 不应该对B,函数一无所知

在指针类型
a*
上调用
buildTree
,其中
buildTree
标记为虚拟,将调用
D*
上的buildTree,给定
root
类型为
D
。因此
add
可用于
D
,因为
D
可以访问is super的公共和受保护方法上课

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

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

这似乎是一个问题:

但是在类D中的构建树中,我们调用了定义为 在B类中,我们如何调用它,因为指针类型是A 不应该对B,函数一无所知

在指针类型
a*
上调用
buildTree
,其中
buildTree
标记为虚拟,将调用
D*
上的buildTree,给定
root
类型为
D
。因此
add
可用于
D
,因为
D
可以访问is super的公共和受保护方法上课

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

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

基本上,您所拥有的是(非常简化):

然后通过做

B* p = new C;
是有效的。但即使指针
p
指向
C
(也是
A
)的对象,它也没有
A
(或
C
)的接口,只有
B
的接口

如果要使用
A
C
中的函数,必须使用向下转换将其转换为正确的类型:

static_cast<D*>(p)->funA();  // Cast to the type `p` *really* is
static_cast(p)->funA();//转换为'p`*类型实际上是

您拥有的基本上是(非常简化的):

然后通过做

B* p = new C;
是有效的。但即使指针
p
指向
C
(也是
A
)的对象,它也没有
A
(或
C
)的接口,只有
B
的接口

如果要使用
A
C
中的函数,必须使用向下转换将其转换为正确的类型:

static_cast<D*>(p)->funA();  // Cast to the type `p` *really* is
static_cast(p)->funA();//转换为'p`*类型实际上是


记住继承是一种“is-a”关系。a
D
对象也是一个
B
对象。
D
继承
B::add
以正常方式(通过
C
)添加。同意,但假设我在类a中有一个funA(),那么D将继承a::funA(),但如果我继承了,就说B*root=new D();root->funA()。我得到一个编译器错误。这两个有什么不同?仍然不是问题。类
D
将有一个
funA
,因为它继承自
C
,后者继承自
a
。因此
D
有一个
funA
函数。a
D
对象也是
a
对象,因为heritance.Unrelated:这段代码中没有强制转换。@有些程序员很抱歉,但为什么编译器会出错?记住,继承是一种“is-a”关系。a
D
对象也是一个
B
对象。
D
继承
B::添加
以正常方式(通过
C
)同意,但假设我有一个funA()在类A中,所以D将继承A::funA(),但如果我继承了,就说B*root=newD();root->funA()。我得到一个编译器错误。这两个有什么不同?仍然不是问题。类
D
将有一个
funA
,因为它继承自
C
,后者继承自
a
。因此
D
有一个
funA
函数。a
D
对象也是
a
对象,因为heritance.Unrelated:此代码中没有强制转换。@Someprogrammerdude抱歉,但为什么编译器出现错误?嗨,Keith,抱歉,无法获取它。这里的根是类型B*,通过getBuilder转换为类型A*,它的类型如何?@user1999934,没有转换任何内容。您正在调用getBuilder,它是在类
Cas
返回此
其中
是一个
D*
。因此您在
a*
上调用buildTree,但它仍然指向一个
D*
。如果您不了解虚拟方法,您应该创建一个更简单的示例。是的,我正在学习虚拟方法,但这让我感到困惑。当您说e“this”是D*,你的意思是说“this”是类型D*并指向D,或者这是类型a*,因为getBuilder的返回类型是a*并指向D。实际对象是a
D
。对其调用虚拟方法时,对象的运行时类型决定使用哪个实现。只有属于(变量的)静态类型的方法可供called@user1999934,您已经使用
new
操作符创建了
D
D
是唯一创建和使用的对象。我想您可能需要问另一个问题:为什么打印输出中的地址不同?我想这才是真正让您困惑的地方。嗨,Keith,对不起,我不能回答t it.这里的根是类型B*,通过getBuilder转换为类型A*,它是类型D*?@user1999934,什么都没有转换。你调用的getBuilder是在类
C
中实现的,因为
返回这个
其中
这个
是一个
D*
。所以你在
A*
上调用buildTree,但是它是till指向a
D*
。如果你不了解虚拟方法,你应该创建一个更简单的示例。是的,我在