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