Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++在该类层次中的P> class n1 { public: virtual void tt() { cout << "n1" << endl; } }; class n2:public n1 { public: void tt() { cout << "n2" << endl; } }; class n3:public n2 { void tt() { cout << "n3" << endl; } }; int main() { n1 *k = new n3; k->tt(); }_C++_Polymorphism - Fatal编程技术网

在C+中重写+;在类的层次结构中 C++在该类层次中的P> class n1 { public: virtual void tt() { cout << "n1" << endl; } }; class n2:public n1 { public: void tt() { cout << "n2" << endl; } }; class n3:public n2 { void tt() { cout << "n3" << endl; } }; int main() { n1 *k = new n3; k->tt(); }

在C+中重写+;在类的层次结构中 C++在该类层次中的P> class n1 { public: virtual void tt() { cout << "n1" << endl; } }; class n2:public n1 { public: void tt() { cout << "n2" << endl; } }; class n3:public n2 { void tt() { cout << "n3" << endl; } }; int main() { n1 *k = new n3; k->tt(); },c++,polymorphism,C++,Polymorphism,您正在覆盖它 如果您不确定覆盖是否正确,我们有一个名为(c++11 required)的关键字,它确保您的覆盖符合虚拟函数/方法声明 这应该可以澄清问题: #include <iostream> using namespace std; class n1 { public: virtual void tt() { cout << "n1" << endl; } }; class n2:public n1 { public: void tt(

您正在覆盖它

如果您不确定覆盖是否正确,我们有一个名为(c++11 required)的关键字,它确保您的覆盖符合虚拟函数/方法声明

这应该可以澄清问题:

#include <iostream>
using namespace std;

class n1
{
public:
    virtual void tt() { cout << "n1" << endl; }
};

class n2:public n1
{
public:
    void tt() override { cout << "n2" << endl; }
};

class n3:public n2
{
    void tt() override { cout << "n3" << endl; }
};

int main()
{
    n1 *a = new n1;
    n1 *b = new n2;
    n1 *c = new n3;

    a->tt();
    b->tt();
    c->tt();

    delete a;
    delete b;
    delete c;
}
#包括
使用名称空间std;
n1类
{
公众:
虚拟void tt(){cout您正在覆盖它

如果您不确定覆盖是否正确,我们有一个名为(c++11 required)的关键字,它确保您的覆盖符合虚拟函数/方法声明

这应该可以澄清问题:

#include <iostream>
using namespace std;

class n1
{
public:
    virtual void tt() { cout << "n1" << endl; }
};

class n2:public n1
{
public:
    void tt() override { cout << "n2" << endl; }
};

class n3:public n2
{
    void tt() override { cout << "n3" << endl; }
};

int main()
{
    n1 *a = new n1;
    n1 *b = new n2;
    n1 *c = new n3;

    a->tt();
    b->tt();
    c->tt();

    delete a;
    delete b;
    delete c;
}
#包括
使用名称空间std;
n1类
{
公众:

virtual void tt(){因此,在3类层次结构a->B->C中,如果a有虚拟方法,B实现了它,这并不意味着从B派生的类将采用已经实现的方法。@adrian.bercovici
B
,如果使用虚拟分派(或静态分派到
B
)调用该方法,则将调用该方法的版本当使用静态分派时,
A
的版本仍然可以调用,即使是在
B
()。这与C#不同,C#继承和重写的方法实际上对重写它的类是私有的。因此,在3类层次结构a->B->C中,如果a有虚拟方法,B实现了它,这并不意味着从B派生的类将采用已经实现的方法。@adrian.bercovici
B
的版本将被调用d如果使用虚拟分派(或静态分派到
B
)调用该方法,
A
的版本在使用静态分派时仍然可以调用,即使在
B
()的实例上也是如此。这不同于C#,在C#中,继承和重写的方法实际上对重写它的类是私有的。
class n1
{
public:
    virtual void tt() { cout << "n1" << endl; }
};

class n2:public n1
{
public:
    void tt() override { cout << "n2" << endl; }
};

class n3:public n2
{

};