首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承层次中成员函数的C++隐藏

继承层次中成员函数的C++隐藏
EN

Stack Overflow用户
提问于 2013-06-11 07:07:03
回答 1查看 161关注 0票数 0

昨天,我写了一些代码,如果这是好的还是坏的做法,我会非常感激的。如果情况不好什么可能会出错。

结构如下:

作为模板,基类A很遗憾地来自API。其目标是能够将来自A的派生类放入std::vector中。我通过基类B实现了这一点,所有从A继承的派生类都将从中继承。如果B中没有纯虚函数,则调用A中的foo()函数。

使用B中的纯虚函数,调用C中的foo()版本。这正是我想要的。

这是不好的做法吗?

编辑:

为了消除我的示例代码中的一些误解:

代码语言:javascript
复制
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,以及

代码语言:javascript
复制
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();

}

带输出

代码语言:javascript
复制
cow and chicken
bull and chicken

是想要的。

据我所知,在容器中存储从模板类派生的类的唯一方法就是使用基类。如果我对派生类使用基类,例如,B,我必须将向量中的每个实例转换回其适当的类。但是在调用bar()时,我不知道确切的类型。

EN

回答 1

Stack Overflow用户

发布于 2013-06-11 07:26:37

我称这是一种糟糕的做法,因为它可能会让人困惑和困惑。

1)函数名在所有基类和子类中都应该是虚的或非虚的。

代码语言:javascript
复制
mixing overriding and overloading within the inheritance hierachry is a very bad idea.
代码语言:javascript
复制
No one really expects something like that.

因此,如果A::foo也应该是虚拟的,或者B和C foo不应该是虚拟的。

2)最好是基类应该是接口。

代码语言:javascript
复制
As such A:foo should be pure virtual and not B::foo.

如果基类已经提供了默认实现,则不要在子类中声明纯虚拟函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17038332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档