抽象基类或派生类中的类变量?

切尔

我有一个抽象类,它的变量owner_是一个字符串。每个派生类都声明此变量的名称。将变量包含在抽象基类中是更好的做法,还是可以在派生类中更好地多次实现它?

#include <string>
#include <iostream>

class Pet
{
    public:
        Pet(const std::string& owner) : owner_(owner) {}
        virtual ~Pet() = 0;
        virtual void print_status() = 0;
    protected:
        const std::string owner_;
};

Pet::~Pet() {}

class Dog : public Pet
{
    public:
        Dog(const std::string& owner) : Pet(owner) {}
        ~Dog() {};
        void print_status()
        {
            std::string s = "Woof! My owner is ";
            s += owner_;
            std::cout << s << std::endl;
        }
    // Or better here?
    // private:
    //     const std::string owner_;
};

class Cat : public Pet
{
    public:
        Cat(const std::string& owner) : Pet(owner) {}
        ~Cat() {};
        void print_status()
        {
            std::string s = "Meow! My owner is ";
            s += owner_;
            std::cout << s << std::endl;
        }
    // Or better here?
    // private:
    //     const std::string owner_;
};

int main()
{
    Dog dog("Mario");
    dog.print_status();

    Cat cat("Luigi");
    cat.print_status();

    return 0;
}
用户名

IMO正是抽象基类的用途:为继承层次结构中的接口提供通用实现。
我将更进一步,甚至将接口与抽象基类分开:

struct IPet {
    virtual ~IPet() = {}
    virtual void print_status() = 0;
    virtual const std::string& get_owner() const = 0;
};

class Pet : public IPet
{
public:
    Pet(const std::string& owner) : owner_(owner) {}
    virtual const std::string& get_owner() const { return owner_; }
    virtual ~Pet() {} // = 0; Don't declare the destructor as pure virtual function
    virtual void print_status() = 0;
protected:
    std::string owner_;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

重用派生类中的基类中的变量:Scala

C ++:使用基类中的仅派生类变量

基类的派生类,用作抽象类

使用抽象基类C ++中的变量派生的类

如何在非抽象基类的派生类中强制重写?

在C++中将抽象基类的不同派生类的对象存储在数组中

没有在派生类中定义的抽象类

如何从抽象类列表中检索派生类?

Python抽象类应强制派生类在__init__中初始化变量

为什么我可以在Python的抽象类中访问派生类的变量?

为具有TypeScript中类型变量的抽象类的派生类分配通用类型

抽象类的新派生类

如何调用在C ++中具有抽象基类和派生类的定义的基类的虚函数定义?

如何从基类向量获得派生类变量?

基类变量用派生类初始化

C#从基类访问派生类变量

对派生类中的成员变量使用派生类型

从抽象基类型的 unique_ptr 获取派生类

在基类构造函数中使用抽象类作为参数,以在派生类中具有更多特定类型

是否可以在派生类中实现抽象方法,但只能在基类中调用抽象方法?

如何在派生类构造函数中初始化基类成员变量?

基类和派生类中具有相同名称的静态成员变量

C ++-在派生类中静态初始化基类保护的成员变量

创建类型为<派生类>的变量以将<基类>对象存储在C#中

从Java中的派生类调用基类构造函数

使用基类在派生类中复制CTOR

迭代中的基类到派生类

基类中派生类的范围-python中的继承

Python:在派生类中隐藏基类的成员