C++多态性,关于宣布对派生类的基础类引用
C++ polymorphism, about announcing a basis class reference to a derived class
#include <iostream>
using namespace std;
class A {
private:
int nVal;
public:
void Fun()
{
cout << "A::Fun" << endl;
}
void Do()
{
cout << "A::Do" << endl;
}
};
class B :public A {
public:
virtual void Do()
{
cout << "B::Do" << endl;
}
};
class C :public B {
public:
void Do()
{
cout << "C::Do" << endl;
}
void Fun()
{
cout << "C::Fun" << endl;
}
};
void Call(B& p)
{
p.Fun(); p.Do();
}
int main() {
C c; Call(c);
return 0;
}
在上面的代码中,输出为
A::Fun
C::Do
但是我无法理解。 在函数调用(B&p(中,引用p应该引用C类中的c,所以为什么输出不是
C::Fun
C::Do
在宣布对派生类的基础类引用时,不同的基础类是否有意义?
问题是A::Fun
没有被标记为virtual
,因此它在运行时找不到C::Fun
。您应该将其标记为:
class A {
private:
int nVal;
public:
virtual void Fun()
{
cout << "A::Fun" << endl;
}
// ...
魔杖盒示例
这是一个很好的错误示例,由于override
说明符,可以在编译时捕获该错误:
class C :public B {
public:
void Do() override
{
cout << "C::Do" << endl;
}
void Fun() override
{
cout << "C::Fun" << endl;
}
};
将打印:
error: 'void C::Fun()' marked 'override', but does not override
void Fun() override
^~~
魔杖盒示例
相关文章:
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- 通过基类引用派生类后打印的错误值
- 如何在 c++ 中通过基类引用访问派生类的对象?
- C 有一个关键字,允许从派生类引用基本类型
- 基础类模板参数的有意义名称
- 如何传递当前类引用以在 C++ 中初始化类成员
- 对由文本实例化的对象的类引用
- 为基础类构造函数提供初始化的成员
- C++多态性,关于宣布对派生类的基础类引用
- 具有相同基础类类型的条件运算符
- 基础类的初始派生类
- 需要从C 类引用和更新值
- 有条件地将基类引用参数视为派生类并将其返回
- 访问类引用信息的 C++ "Incomplete type not allowed"错误(具有前向声明的循环依赖项)
- 将派生类指针强制转换为基类引用
- 基础类指针使用已分配的内存来派生类指针
- 使用构造函数调用创建新的类引用
- 使用 Cython 时如何将一个C++类(引用)传递给另一个类(引用)
- 在C++中将Observed类引用为Observer的成员变量