c++ - 基类被调用的方法
问题描述
我有以下代码:
#include<iostream>
using namespace std;
struct Base{
void f(int x){
cout<<"B";
}
};
struct Derived: public Base {
virtual void f(double x){
cout<<"D";
}
};
int main(){
Derived d;
int x = 5;
d.f(x);
Base *pb = &d;
pb->f(x);
}
它输出:DB
即使 pb 存储指向派生类的指针。为什么
Base
调用类的方法?
解决方案
声明Derived::f
virtual 不会使Base::f
virtual,因此当您调用f
指向Base
then 的指针时Base::f
。
您应该virtual
在Base
. 然后它也会virtual
在 中Derived
,你不需要在virtual
那里重复。在Derived
你应该使用这样的override
说明符:
struct Base{
virtual void f(int x){
cout<<"B";
}
};
struct Derived: public Base {
void f(double x) override {
cout<<"D";
}
};
当override
方法实际上不是override
继承方法时,说明符有助于捕获错误。例如,对于上述情况,您将收到以下错误:
source>:10:10: error: 'void Derived::f(double)' marked 'override', but does not override
10 | void f(double x) override {
| ^
当您要覆盖时,参数类型必须匹配。
此代码打印预期的DD
:
#include <iostream>
struct Base {
virtual void f(int x){
std::cout << "B";
}
};
struct Derived: public Base {
void f(int x) override {
std::cout << "D";
}
};
请注意,如果您不使用,override
那么此类错误可能会被忽视。当类定义如下:
struct Base{
virtual void f(int x){
std::cout<<"B";
}
};
struct Derived: public Base {
void f(double x) {
std::cout<<"D";
}
};
然后Derived::f
不覆盖Base::f
。它只是隐藏它,输出仍然是DB
.
推荐阅读
- php - 在 zend-expressive 中更改 default_suffix 很热门?
- android - MvvmCross - 卡在启动画面中
- jprofiler - JProfiler中的Net IO是什么意思?
- javascript - 如何获取特定x,y周围的所有坐标
- c++ - 如何使用 clang 禁用格式安全错误?
- java - 单击按钮启动新活动时,我的应用程序崩溃
- php - 有没有一种方法可以在没有数据库的情况下将 HTML 页面链接在一起并在它们之间共享信息?
- c# - C#: Udp socket and receivefrom() method
- c - Segmentation fault while mallocing 2d arrays?
- external - 使用 Xcode 10 为 LiveCode 9.01 构建 C/C++ 外部