c++ - C++ 中的基本继承

标签 c++

我现在正在学习 C++,我有一个可能非常基本的问题。

如果我在 .h 文件中有以下内容:

class Top{
    Top();
    virtual ~Top() = 0;
}

class Bottom: public Top{
    public:
       Bottom(char core);
       virtual ~Bottom();
    public:
       char getCore() const;
    private:
       char core;  
}

Bottom 的实现会像下面这样吗?

Top::Top(): Top() {}

//Bottom
Bottom::Top(char core){
    core = core;
}

char Bottom::getCore(){
    return core;
}

或者

Top::Top(): Top() {}

//Bottom
Bottom::Bottom(char core){
    core = core;
}

char Bottom::getCore(){
    return core;
}

最佳答案

您的代码存在一些问题。

class Top{
    Top();
    virtual ~Top() = 0;
}

class 访问控制默认为 private。这意味着此类具有私有(private)构造函数,因此无法构造,也无法构造子类。固定版本可能如下所示:

class Top {
protected:
    Top();
    virtual ~Top() = 0;
}

virtual 析构函数意味着您无法创建 Top,但您仍然可以创建子类。

正如@Deduplicator 指出的那样,您仍然需要为 Top::~Top() 定义,因为子类的析构函数将调用它:

Top::~Top() {}

class Bottom 的声明看起来不错,尽管您不需要重复 public:

两个类定义都有一个小问题:你忘记了右大括号后的分号。

至于实现:

Top::Top(): Top() {}

第三个 Top 不正确。该语法用于将事物传递给父类(super class)的构造函数,或委托(delegate)给另一个构造函数(您没有)。 Top 不是它自己的父类(super class)。正确的代码很简单:

Top::Top() {}

继续……

Bottom::Bottom(char core){
    core = core;
}

这有一个问题,因为参数core隐藏了类成员core。它们需要是不同的名称(尽管不要求类声明中的参数名称与方法定义中的参数名称匹配)。我通常通过在参数名称后面添加下划线来解决这个问题:

Bottom::Bottom(char core_) {
    core = core_;
}

最后:

char Bottom::getCore(){
    return core;
}

这是错误的,因为您将其声明为 const 方法,但此定义不是 const。固定:

char Bottom::getCore() const {
    return core;
}

顺便说一句,您可以拥有方法的const 和非const 版本。运行哪一个取决于 this 是否为 const

最后一件事:您忘记定义 Bottom::~Bottom()。添加这个:

Bottom::~Bottom() {
}

我有此代码的固定版本,外加一些 token 测试代码,posted online.

关于c++ - C++ 中的基本继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23599196/

相关文章:

c++ - 简单的设计选择?

c++ - 与函数一起使用时运算符 > 不匹配

c++ - 如何从 C++ 中的文本文件中读取长行?

c++ - 防止进入特定功能的 VS2012 NativeDE\StepOver 注册表项是否更改了格式?

c++ - “X 不是模板”错误

c++ - 主函数中显式模板实例化

c++ - 递归模板参数删除

c++ - 为什么 for(int i=0; i<10;++i) 和 for(int i=0; i<10; i++) 返回相同?

c++ - 使用 Pthreads 的 Hello World 内存损坏

c++ - 使用算法头对 structArray 进行排序