【发布时间】:2023-04-09 14:32:01
【问题描述】:
如果我在基类中定义了一个接口并通过派生类调用该接口,那么我发现使用该基类接口的唯一方法是在派生类中使用“using”。我不确定这是否是一个好习惯。这是一个示例程序
#include <memory>
#include <iostream>
using namespace std;
template <class T>
class B
{
public:
void outB() { cout << "dim from B is " << dim_ << endl ; }
B(int dim) : dim_(dim) {}
~B() {}
protected:
int dim_;
};
template <class T>
class A : B<T>
{
public:
using B<T>::dim_;
using B<T>::outB;
void outA() { cout << "dim from A is " << dim_ << endl ; }
A(int dim) : B<T>(dim) {}
~A() {}
private:
};
int main(int argc, const char *argv[])
{
shared_ptr<A<double> > ap(new A<double>(2));
ap->outA();
ap->outB();
return 0;
}
如果我删除using B<T>::outB; 行,程序将无法编译。 http://ideone.com/x6gm0
一直使用using 的问题在于,如果我有一个很长的派生类链(例如,如果我广泛使用适配器模式),我必须在每个派生类中写using ...; 用于所有继承接口。
在每个派生类中绕过using 的重复以保留基类的接口的好做法是什么?
注意,我想避免使用virtual。我需要代码的性能。
【问题讨论】:
-
早期优化...你确定不能使用虚方法吗?很少有指针间接可以避免您引入难以发现的错误,并且它们将使您的代码更易于阅读。 你确定吗???*
-
这是两个名字不同的函数,你并没有在派生类中使用基类的函数。
-
@C-xC-t 我不知道如何表达标题。但我的意思是从 main 中调用 outB。由于 ap 指针属于 A 类型,我是否应该能够从 main 访问 B 类(A 派生的类)的接口?
-
@Adriano,老实说,我还在学习 C++,我跳过了获得虚函数的经验。我使用现代 c++ 和 boost 作为指导。到目前为止,据我所知,可以避免使用虚拟功能;有时通过使用 CRTP。所以我知道它们是什么,并且可以阅读它们,但我尝试采用一种避免它们的风格。
标签: c++ inheritance polymorphism