dra*_*osb 2 c++ polymorphism overloading
让我们说我们有:
Class A
{
public:
virtual void print(){ std::cout<<" A "<<endl; }
}
Class B : public A
{
public:
virtual void print(int x){ std::cout<<" B "<<endl;}
}
Run Code Online (Sandbox Code Playgroud)
我认为函数print的B类定义会隐藏A类的函数print.但是下面的代码工作并打印"A"
int main()
{
A * a = new B;
a->print();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我像这样写主函数它不起作用:
int main()
{
B b;
b.print();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是...在我的第一个main()示例中,我有一个调用print()的B对象...不应该print()被隐藏并且有一个错误,就像在第二个main()示例中一样
成员函数print()
in B
不会覆盖print()
in,A
因为它具有不同的签名.因此,当print()
你在第一个未经编辑的版本中main()
调用时,只有一个匹配函数可以调用,正如用户juanchopanza所指出的:A::print()
.
编辑:总结:
多态行为:如果A::print()
并且B::print()
具有相同的签名,print()
只要通过指针或引用引用对象,就会在运行时选择适当的签名.
函数重载:由于类是作用域而函数不跨作用域重载,因此基类中的函数被派生类中的同名函数隐藏.为此,用于引用对象的变量类型是重要的,而不是对象本身的类型.因此,在第二个示例中,您会收到一个错误,即没有匹配的函数可以调用,但在第一个示例中,只有一个函数在范围内.
归档时间: |
|
查看次数: |
711 次 |
最近记录: |