C++虚函数忽略范围说明符
C++ virtual function ignoring scope specifier
请参考以下C++代码:
#include <iostream>
class A {
public:
virtual ~A() {}
virtual void display() {
std::cout << "Display A" << std::endl;
}
};
class B : public A {
// ! NO 'display()' function in this class.
};
class C : public B {
public:
void display() {
std::cout << "Display C" << std::endl;
B::display();
}
};
int main(void) {
A* ptr = new C();
ptr->display();
delete ptr;
return 0;
}
这个程序的输出是:
Display C
Display A
我希望这个程序有编译错误,因为 B::display() 没有定义。
有人可以解释这段代码的行为吗?
非常感谢您的宝贵时间!
Could somebody explain the behaviour of this code?
B
简单地继承了 A
的 display
函数。因为,它是虚拟的 B
可以将行为覆盖为不同的东西(即,如果它需要不同的实现,它可以创建一个,否则它可以采用它继承的东西)。
您将虚函数误认为是抽象函数。函数 是 虚拟的,因为它有一个可以被基 class 的子class 覆盖的 vtable 条目。然而,基 class 不需要覆盖条目。
例如,B::display()
的 vtable 条目是 A::display()
,这就是您在示例中看到的内容。
为了完整起见,您在 C++ 中声明抽象函数如下:virtual void display() =0;
没有函数体。对于 C++,必须重写此函数以允许您实例化 class 类型,否则您将遇到编译错误。
根据 C++ 标准(派生 10 classes)
- ...Unless redeclared in the derived class, members of a base class are
also considered to be members of the derived class. The base class
members are said to be inherited by the derived class. Inherited
members can be referred to in expressions in the same manner as other
members of the derived class, unless their names are hidden or
ambiguous...
所以你可以引用在class B 中继承的成员函数display
在class A 中声明的方法与class B 的其他成员相同。
请参考以下C++代码:
#include <iostream>
class A {
public:
virtual ~A() {}
virtual void display() {
std::cout << "Display A" << std::endl;
}
};
class B : public A {
// ! NO 'display()' function in this class.
};
class C : public B {
public:
void display() {
std::cout << "Display C" << std::endl;
B::display();
}
};
int main(void) {
A* ptr = new C();
ptr->display();
delete ptr;
return 0;
}
这个程序的输出是:
Display C
Display A
我希望这个程序有编译错误,因为 B::display() 没有定义。
有人可以解释这段代码的行为吗?
非常感谢您的宝贵时间!
Could somebody explain the behaviour of this code?
B
简单地继承了 A
的 display
函数。因为,它是虚拟的 B
可以将行为覆盖为不同的东西(即,如果它需要不同的实现,它可以创建一个,否则它可以采用它继承的东西)。
您将虚函数误认为是抽象函数。函数 是 虚拟的,因为它有一个可以被基 class 的子class 覆盖的 vtable 条目。然而,基 class 不需要覆盖条目。
例如,B::display()
的 vtable 条目是 A::display()
,这就是您在示例中看到的内容。
为了完整起见,您在 C++ 中声明抽象函数如下:virtual void display() =0;
没有函数体。对于 C++,必须重写此函数以允许您实例化 class 类型,否则您将遇到编译错误。
根据 C++ 标准(派生 10 classes)
- ...Unless redeclared in the derived class, members of a base class are also considered to be members of the derived class. The base class members are said to be inherited by the derived class. Inherited members can be referred to in expressions in the same manner as other members of the derived class, unless their names are hidden or ambiguous...
所以你可以引用在class B 中继承的成员函数display
在class A 中声明的方法与class B 的其他成员相同。