Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该在将实现委托给子类的类中包含成员定义吗?_C++ - Fatal编程技术网

C++ 我应该在将实现委托给子类的类中包含成员定义吗?

C++ 我应该在将实现委托给子类的类中包含成员定义吗?,c++,C++,假设我有一个抽象类“Base”,它扩展了另一个抽象类“Subclass”。Base有许多抽象成员函数,“Subclass”实现了其中的许多函数,但它将自己的子类留给其他子类来实现。我是否应该包含我在中间类中没有实现的成员函数的签名 换句话说,假设我有以下类结构: Car.hpp: class Car { public: virtual std::string getMake() = 0; virtual std::string getType() = 0; virtual

假设我有一个抽象类“Base”,它扩展了另一个抽象类“Subclass”。Base有许多抽象成员函数,“Subclass”实现了其中的许多函数,但它将自己的子类留给其他子类来实现。我是否应该包含我在中间类中没有实现的成员函数的签名

换句话说,假设我有以下类结构:

Car.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";
}
跑车。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";
}
我是否仍然需要include
virtualstd::string getMake()=0跑车.hpp


无论我是否包含它,代码都会编译,程序的执行似乎完全相同。

您不需要在中间类中再次指定抽象方法。它将作为纯类被中间类继承,并且仍然需要在另一个子类中重写它


请注意,您的中间类仍然是抽象的,您无法创建它的实例。

因为它是双向编译的,所以这在某种程度上是一个风格问题。我遵循“尽可能少做工作”的一般规则。我认为它适用于这里

省略它将导致编译错误,对于那些试图在不实现getMake()的情况下对SportsCar进行子类化的人来说。不在中间类中重复定义可以使将来更容易更改接口

有一种情况,出于可读性的目的,我可能会将中间纯虚拟放在其中,即当您有如下内容时:

template<typename T>
class Foo : public T {...};
模板
Foo类:公共T{…};

在这种情况下,由于很难找到T的类型,因此添加额外的定义有一定的价值。

不仅不需要在层次结构的中间类中重新指定纯虚拟成员函数声明,但我建议不要这样做:当C++编程时,必须习惯于在所有可能合法的地方寻找事物。顺便说一下,许多其他编程语言也是如此