抽象基类或派生类中的类变量
Class variable in abstract base class or derived class?
我有一个抽象类,该类具有一个可变的 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_;
};
您可能需要使用摘要来迫使您的孩子类实现该方法,但不一定定义其中的任何内容。如果您故意使用它们,则将所有者在基类中,但是各自方法中的不同内容是正确的。
摘要方法正在使用,例如,如果您希望所有子类都至少在自己的类中声明该功能,这有时是相应子类的不同行为所需的。
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
{
private:
int age;
public:
Dog(const std::string& owner, int age) :
Pet(owner), age(age) {}
~Dog() {};
void print_status(){
std::cout << "Woof! My owner is " << this->owner_ <<
" and my age is " << this->age << "nn";
}
};
class Cat : public Pet
{
public:
Cat(const std::string& owner) :
Pet(owner) {}
~Cat() {};
void print_status() {
std::cout << "Miaw, my owner is " << this->owner_ << 'n';
}
};
int main()
{
Dog dog("Mario", 25);
dog.print_status();
Cat cat("Luigi");
cat.print_status();
system("pause");
return 0;
}
相关文章:
- 如何在C++中找到变量派生最多的子类?
- 如何将一个变量用于父类和派生类
- C++:使用基类中的仅派生类变量
- OOP - 抽象类类型,初始化基类和派生类中的变量
- 如何使黑客合法化,该黑客假定派生的类变量的相邻存储
- 如何从基类向量达到派生的类变量
- 如何使用基类对象设置派生类变量的值
- 初始化基类和派生类中的类成员变量
- C 使用基类中的派生类变量
- 如何创建派生指针类变量
- 抽象基类或派生类中的类变量
- 派生自非模板基类的模板类:无法访问基类变量
- 通过派生类构造函数初始化后,从main()访问基类变量
- 派生类变量作用域 c++
- 将派生类变量添加到向量<BaseClass>
- 通过 CRTP 使用派生类变量初始化基类静态常量变量
- 如果基类和派生类都具有相同的成员变量,编译器如何解析要调用的成员
- 使用派生类变量的基类函数
- 将派生类对象存储在基类变量中
- 基类和派生类私有成员变量的使用