C++ 是否使用c++;类向下流到它';孩子们
在本例中,为什么要执行树底部的子类的方法? 我认为虚拟的意思是,如果我通过类的指针执行该方法,但实际上指针指向子类的实例,它将执行子类的方法。但显然,如果任何一个家长将该方法定义为虚拟的,它就会这样做。有人能解释一下为什么会这样,使用虚拟机的最佳实践是什么吗?(我被教导把它放在所有重写基类虚方法的方法前面) 代码如下:C++ 是否使用c++;类向下流到它';孩子们,c++,class,inheritance,polymorphism,virtual,C++,Class,Inheritance,Polymorphism,Virtual,在本例中,为什么要执行树底部的子类的方法? 我认为虚拟的意思是,如果我通过类的指针执行该方法,但实际上指针指向子类的实例,它将执行子类的方法。但显然,如果任何一个家长将该方法定义为虚拟的,它就会这样做。有人能解释一下为什么会这样,使用虚拟机的最佳实践是什么吗?(我被教导把它放在所有重写基类虚方法的方法前面) 代码如下: #include <iostream> class BaseClass { public: virtual void myFunc()=0; };
#include <iostream>
class BaseClass
{
public:
virtual void myFunc()=0;
};
class Child1: public BaseClass
{
public:
void myFunc(){
std::cout << "Child1\n";
}
};
class Child2: public Child1
{
public:
void myFunc(){
std::cout << "Child2\n";
}
};
int main()
{
Child1 c1;
Child2 c2;
Child1 * p = &c1;
p->myFunc();
p = & c2;
p->myFunc();
return 0;
}
#包括
类基类
{
公众:
虚空myFunc()=0;
};
类Child1:公共基类
{
公众:
void myFunc(){
std::cout myFunc();
返回0;
}
这将两次打印“Child1”和“Child2”,而不是“Child1”,就像没有虚拟方法一样。我需要做什么才能使虚拟方法具有预期的结果?这就是多态性的含义 如果您有一个指向基类(指针的所谓静态类型)的指针,并且该基类被分配了指向派生类(指针的所谓动态类型)的指针,那么将在实际指向的派生类的虚拟函数指针表中搜索虚拟函数 在您的程序中,类
Child2
是类Child1
class Child2: public Child1
{
//...
};
类
Child1
是类Child2
的基类。类Child2
覆盖其基类Child1
的虚函数myFunc是的,virtual
也使所有子代函数虚化tion应该正好有一个virtual
、override
或final
关键字来指示它是虚拟的以及它在继承层次结构中的位置。是的,这就是动态多态的工作方式。您希望实现什么?您可以将类对虚拟函数的重写标记为final
,这将阻止进一步的后代编写自己的实现。但这会导致您当前的代码无法编译,因为如果Child1::myFunc
是final,那么Child2
将试图覆盖它。我认为没有办法在仍然允许后代的情况下分割差异并关闭虚拟性s覆盖函数。是的,没有与C#隐藏基类函数的“new”关键字等效的关键字…链接的问题很有用,谢谢@ChrisMM(很抱歉重复),Nathan Pierson回答了我问题的第二部分。谢谢大家