在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++11 required)的关键字,它确保您的覆盖符合虚拟函数/方法声明 这应该可以澄清问题:在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(
#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.bercoviciB
,如果使用虚拟分派(或静态分派到B
)调用该方法,则将调用该方法的版本当使用静态分派时,A
的版本仍然可以调用,即使是在B
()。这与C#不同,C#继承和重写的方法实际上对重写它的类是私有的。因此,在3类层次结构a->B->C中,如果a有虚拟方法,B实现了它,这并不意味着从B派生的类将采用已经实现的方法。@adrian.bercoviciB
的版本将被调用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
{
};