Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否使用c++;类向下流到它';孩子们_C++_Class_Inheritance_Polymorphism_Virtual - Fatal编程技术网

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回答了我问题的第二部分。谢谢大家