【问题标题】:Defining pure virtual functions from inherited virtual base classes从继承的虚基类定义纯虚函数
【发布时间】:2015-11-13 05:19:20
【问题描述】:

假设我有一个带有虚拟方法的类和两个以不同方式定义该方法的派生类:

class animal
{
    virtual bool isBlack() = 0;
};

class blackAnimal : public animal
{
    virtual bool isBlack() { return true; }
};

class stripedAnimal : public animal
{
    virtual bool isBlack() { return false; }
};

现在我想从虚拟基类派生另一个类,并创建两个新的子类型:

class bigCat : public animal {}; // isBlack() is still pure virtual

// I wish that this worked and that isBlack would return true
class jaguar : public bigCat, public blackAnimal {};

// I wish that this worked and that isBlack would return false
class tiger : public bigCat, public stripedAnimal {};

我该怎么做。当我这样做时,animal 的 isBlack() 方法保持虚拟状态。当我从定义animal::isBlack() 的类派生时,我希望isBlack 成为一个有效的虚函数。

【问题讨论】:

    标签: c++ inheritance


    【解决方案1】:

    这是一个“有效”的实现,但我强烈建议不要这样做:

    class Animal {
        public:
            virtual bool isBlack() = 0;
    }
    
    class BlackAnimal : public virtual Animal {
        public:
            virtual bool isBlack() {return true;}
    }
    
    class BigCat : public virtual Animal {}
    
    class Jaguar : public BigCat, public BlackAnimal { }
    

    您可能想阅读 https://isocpp.org/wiki/faq/multiple-inheritance 以了解 C++ 中的多重继承的概述,尤其是有关虚拟继承的本节 https://isocpp.org/wiki/faq/multiple-inheritance#mi-diamond

    一般来说,这里的问题是您的 jaguar 类有两个 isBlack() 函数 - 一个来自 animal,一个来自 blackAnimal。使用虚拟继承只会产生“animal”基类的一个实例,如果设置正确,blackAnimal 的 isBlack() 会优先。

    (我假设您希望 isBlack() 是虚拟的,并且在编写示例时犯了一个错误,并且您也知道具有虚拟函数的类应该具有虚拟析构函数)。

    【讨论】:

    • 是的,第一种方法是虚拟的。而且我知道我需要一个虚拟析构函数,但我想让示例保持简单。
    • 您的示例对我来说不太适用,因为您已将 bigCat 排除在外。这个想法是,在这种情况下,“bigCat”类会做一些依赖于动物方法的事情。然后美洲虎和老虎班将从那里专门化。
    • 这是为了简化目的 - 它也适用于现有的 bigCat 类。我会编辑它。
    猜你喜欢
    • 2018-10-09
    • 1970-01-01
    • 2015-08-07
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多