运行时绑定和虚拟继承
runtime binding and virtual inheritence
class Base {
public:
virtual int f() const {
cout << "Base::f()n";
return 1;
}
virtual void f(string) const {}
virtual void g() const {}
};
class Derived4 : public Base {
public:
int f(int) const {
cout << "Derived4::f()n";
return 4;
}
};
int main()
{
string s("hello");
Derived4 d4;
Base& br = d4; // Upcast
// br.f(1); // Derived version unavailable
br.f(); // why does it compile and run?
br.f(s);// why does it compile and run?
}
在派生中:重载 f()
的 base .. 所以所有的基本f()
版本都应该被隐藏。
现在,对于 br.f(( 和 br.f(s(:由于运行时绑定,应该调用派生的f()
和f(s)
,但它们应该被隐藏,代码仍然编译并执行 int Base::f(( 和 void Base::f(string(。
Q1 : 我错过了什么?
问2 : br.f(1)
不会编译,因为在编译期间,将执行类型检查,而 Base 中不存在int f(int)
。我说的对吗?
基
类永远不会知道派生类中新添加的成员,它只有关于声明自己的成员的信息。
所以当派生类实例d4
被分配给基类引用br
时,新添加的方法int f(int) const
被隐藏到br
。这就是为什么以下代码的编译错误
// br.f(1); // Derived version unavailable
其中以下两行编译成功
br.f();
br.f(s);
为了更多了解:
class Base {
public:
virtual int f() const {
cout << "Base::f()n";
return 1;
}
virtual void f(string) const {}
virtual void g() const {}
};
class Derived4 : public Base {
public:
int f(int) const {
cout << "Derived4::f()n";
return 4;
}
void g() const {
cout<< "Derived4::g()" << endl;
}
};
int main()
{
string s("hello");
Derived4 d4;
Base& br = d4; // Upcast
// br.f(1); // Derived version unavailable
br.f(); // No Compilation error
br.f(s);// No Compilation error
d4.f(); // Compilation error
d4.f(s); // Compilation error
d4.f(1); // No Compilation error
d4.g(); // No Compilation error
br.g(); // Will print - "Derived4::g()"
}
希望对您有所帮助!
函数
int Derived4::f(int)
隐藏基类中的函数,但不会覆盖它们。 为此,它应该具有完全相同的签名。
在函数重写的情况下,可以在基类引用上调用函数,并查看正在调用的派生类函数。
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 大小虚拟继承中的派生类
- 删除C++继承中虚拟类成员的代码重复
- 重写虚拟函数和继承
- C++ 多级虚拟继承编译问题
- 如何正确获得虚拟继承?
- 编译时继承类中的隐式虚拟与显式虚拟
- 钻石继承虚拟成员铸造与指针
- CPP 继承虚拟方法解析顺序
- 关于C 接口(纯虚拟类)/多重继承/虚拟继承的设计Qustion
- 继承虚拟类C 的派生类
- 多个继承/虚拟函数
- 不能从具有虚拟继承(C++虚拟继承)的类派生
- C++多重继承+虚拟函数(-歧义)=怪异行为(也是函数指针)
- 为什么我不能继承虚拟基的构造函数?
- C++继承虚拟函数崩溃
- c++多重继承/虚拟继承
- 派生类的成员函数是否从基类继承虚拟性?
- 继承虚拟函数的类的boost::optional失败的原因
- c++继承虚拟函数