昨天,我写了一些代码,如果这是好的还是坏的做法,我会非常感激的。如果情况不好什么可能会出错。
结构如下:
作为模板,基类A很遗憾地来自API。其目标是能够将来自A的派生类放入std::vector中。我通过基类B实现了这一点,所有从A继承的派生类都将从中继承。如果B中没有纯虚函数,则调用A中的foo()函数。
使用B中的纯虚函数,调用C中的foo()版本。这正是我想要的。
这是不好的做法吗?
编辑:
为了消除我的示例代码中的一些误解:
template <class T>
class A
{
public:
/* ctor & dtor & ... */
T& getDerived() { return *static_cast<T*>(this); }
void bar()
{
getDerived().foo(); // say whatever derived class T will say
foo(); // say chicken
}
void foo() { std::cout << "and chicken" << std::endl; }
};
class B : public A<B>
{
public:
/* ctor & dtor */
virtual void foo() = 0; // pure-virtual
};
class C : public B
{
public:
/* ctor & dtor */
virtual void foo() { std::cout << "cow"; }
};
class D : public B
{
public:
/* ctor & dtor */
virtual void foo() { std::cout << "bull"; }
};向量应同时包含C和D,以及
void main()
{
std::vector<B*> _cows;
_cows.push_back((B*)new C()));
_cows.push_back((B*)new D()));
for(std::vector<B*>::size_type i = 0; i != _cows.size(); ++i)
_cows[i].bar();
}带输出
cow and chicken
bull and chicken是想要的。
据我所知,在容器中存储从模板类派生的类的唯一方法就是使用基类。如果我对派生类使用基类,例如,B,我必须将向量中的每个实例转换回其适当的类。但是在调用bar()时,我不知道确切的类型。
发布于 2013-06-11 07:26:37
我称这是一种糟糕的做法,因为它可能会让人困惑和困惑。
1)函数名在所有基类和子类中都应该是虚的或非虚的。
mixing overriding and overloading within the inheritance hierachry is a very bad idea.No one really expects something like that.因此,如果A::foo也应该是虚拟的,或者B和C foo不应该是虚拟的。
2)最好是基类应该是接口。
As such A:foo should be pure virtual and not B::foo.如果基类已经提供了默认实现,则不要在子类中声明纯虚拟函数。
https://stackoverflow.com/questions/17038332
复制相似问题