C++ 我应该在将实现委托给子类的类中包含成员定义吗?
假设我有一个抽象类“Base”,它扩展了另一个抽象类“Subclass”。Base有许多抽象成员函数,“Subclass”实现了其中的许多函数,但它将自己的子类留给其他子类来实现。我是否应该包含我在中间类中没有实现的成员函数的签名 换句话说,假设我有以下类结构: Car.hpp:C++ 我应该在将实现委托给子类的类中包含成员定义吗?,c++,C++,假设我有一个抽象类“Base”,它扩展了另一个抽象类“Subclass”。Base有许多抽象成员函数,“Subclass”实现了其中的许多函数,但它将自己的子类留给其他子类来实现。我是否应该包含我在中间类中没有实现的成员函数的签名 换句话说,假设我有以下类结构: Car.hpp: class Car { public: virtual std::string getMake() = 0; virtual std::string getType() = 0; virtual
class Car {
public:
virtual std::string getMake() = 0;
virtual std::string getType() = 0;
virtual ~Car { };
}
class SportsCar : public Car {
public:
std::string getType();
// Do I need to specify virtual std::string getMake() = 0; here?
}
std::string SportsCar::getType()
{
return "sports";
}
class FerrariSportsCar : public SportsCar {
public:
std::string getMake();
}
std::string FerrariSportsCar::getMake()
{
return "ferrari";
}
跑车。hpp:
class Car {
public:
virtual std::string getMake() = 0;
virtual std::string getType() = 0;
virtual ~Car { };
}
class SportsCar : public Car {
public:
std::string getType();
// Do I need to specify virtual std::string getMake() = 0; here?
}
std::string SportsCar::getType()
{
return "sports";
}
class FerrariSportsCar : public SportsCar {
public:
std::string getMake();
}
std::string FerrariSportsCar::getMake()
{
return "ferrari";
}
跑车。cpp:
class Car {
public:
virtual std::string getMake() = 0;
virtual std::string getType() = 0;
virtual ~Car { };
}
class SportsCar : public Car {
public:
std::string getType();
// Do I need to specify virtual std::string getMake() = 0; here?
}
std::string SportsCar::getType()
{
return "sports";
}
class FerrariSportsCar : public SportsCar {
public:
std::string getMake();
}
std::string FerrariSportsCar::getMake()
{
return "ferrari";
}
FerrariSportsCar.hpp:
class Car {
public:
virtual std::string getMake() = 0;
virtual std::string getType() = 0;
virtual ~Car { };
}
class SportsCar : public Car {
public:
std::string getType();
// Do I need to specify virtual std::string getMake() = 0; here?
}
std::string SportsCar::getType()
{
return "sports";
}
class FerrariSportsCar : public SportsCar {
public:
std::string getMake();
}
std::string FerrariSportsCar::getMake()
{
return "ferrari";
}
FerrariSportsCar.cpp:
class Car {
public:
virtual std::string getMake() = 0;
virtual std::string getType() = 0;
virtual ~Car { };
}
class SportsCar : public Car {
public:
std::string getType();
// Do I need to specify virtual std::string getMake() = 0; here?
}
std::string SportsCar::getType()
{
return "sports";
}
class FerrariSportsCar : public SportsCar {
public:
std::string getMake();
}
std::string FerrariSportsCar::getMake()
{
return "ferrari";
}
我是否仍然需要includevirtualstd::string getMake()=0代码>在跑车.hpp中
无论我是否包含它,代码都会编译,程序的执行似乎完全相同。您不需要在中间类中再次指定抽象方法。它将作为纯类被中间类继承,并且仍然需要在另一个子类中重写它
请注意,您的中间类仍然是抽象的,您无法创建它的实例。因为它是双向编译的,所以这在某种程度上是一个风格问题。我遵循“尽可能少做工作”的一般规则。我认为它适用于这里
省略它将导致编译错误,对于那些试图在不实现getMake()的情况下对SportsCar进行子类化的人来说。不在中间类中重复定义可以使将来更容易更改接口
有一种情况,出于可读性的目的,我可能会将中间纯虚拟放在其中,即当您有如下内容时:
template<typename T>
class Foo : public T {...};
模板
Foo类:公共T{…};
在这种情况下,由于很难找到T的类型,因此添加额外的定义有一定的价值。不仅不需要在层次结构的中间类中重新指定纯虚拟成员函数声明,但我建议不要这样做:当C++编程时,必须习惯于在所有可能合法的地方寻找事物。顺便说一下,许多其他编程语言也是如此