c++ - 从基类调用派生类中的非虚函数(C++)
问题描述
test
不是虚函数,在基类和派生类中都定义了。我有一个派生类对象。它最终调用test
基类而不是派生类中的基类。为什么会这样?如何设置它以便根据对象类型调用测试。
电流输出
B func
A f1
A test
我希望它是
B func
A f1
B test
#include <iostream>
using namespace std;
class A {
protected:
void test()
{
cout<<"A test"<<endl;
}
void f1(){
cout<<"A f1" <<endl;
test();
}
};
class B: public A {
protected:
void test()
{
cout<<"B test" <<endl;
}
public:
void func(){
cout<<"B func" << endl;
f1();
}
};
int main()
{
B tmp;
tmp.func();
return 0;
}
解决方案
有 2 种方法可以存档所需的结果:
使用将virtual
基类函数声明为虚拟函数将确保默认调用目标函数的最高继承。例如,在您的情况下:
class A {
protected:
/**
* Declared also in the derived class, so as long the current object is the derived class,
* this function will be called from the derived class.
* [Enabled only due to the use of the `virtual` keyword].
*/
virtual void test() {
cout << "A test" << endl;
}
void f1() {
cout << "A f1" << endl;
test();
}
};
使用 CRTP [巨大的开销来存档可以使用虚拟存档的内容]
template <class Derived> // Template param that will accept the derived class that inherit from this class.
class A {
protected:
virtual void test() const {
cout << "A test" << endl;
}
void f1() const {
cout << "A f1" << endl;
static_cast<Derived const&>(*this).test(); // Call test() function from the derived class.
}
};
class B: public A<B> { // inherit A that accepts template argument this derived class
// protected:
public: // Pay attention that now test should be public in the derived class in order to access it via the base class.
void test() const override {
cout << "B test" << endl;
}
//public:
void func() const {
cout << "B func" << endl;
f1();
}
};
阅读更多关于 CRTP的信息。
推荐阅读
- laravel - Laravel Eloquest 加入最大和最小值
- google-bigquery - BigQuery - 自定义分区表的最大分区日期
- php - api无响应时处理
- firebase - 如何在一个流中合并多个流
- asp.net - HttpContextAccessor 线程安全吗?
- javascript - 如何在冒泡排序中进行第 n 次迭代后获取数组?
- jenkins-pipeline - 基于 Jenkinsfile 上的列表的阶段
- mocha.js - 使用快递服务器时,摩卡在超测后没有停止
- python - 在 Python 中将列表与 pandas 中的日期进行比较
- mysql - FindOrCreate 具有 2 个唯一列