C++继承不继承祖父文件

标签 c++ inheritance polymorphism

最近我试图解决 C++ 继承和多态性问题,但我遇到了一些对我来说毫无意义的问题。 我在单独的文件中有 2 个 header 和一个带有实现的 cpp 文件。我的代码的简短摘要如下:

#ifndef MANDEL_H_
#define MANDEL_H_

class Mandel{

public:
    virtual void compute("various arguments") = 0;

    //dummy destructor, I must have one or compile is sad and I dunno why
    virtual ~Mandel();
private:
    virtual int compute_point("various arguments") = 0;
};

#endif

这是我的“祖父”标题,名为“Mandel.h”。现在转到“父亲”标题。下一个 header 指定了一些特定于 Mandel 的白色和黑色实现的变量,称为“Black_White_Mandel.h”:

#ifndef BLACK_WHITE_MANDEL_H_
#define BLACK_WHITE_MANDEL_H_

#include "Mandel.h"

class Black_White_Mandel: public Mandel {

protected:
    int max_iterations; //a specific variable of this Black_White Version
};

#endif

现在在名为 White_Black_Mandel_Imp1.cpp 的单独文件中执行 Black_White_Mandel header :

#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#include "Mandel.h"
#include "Black_White_Mandel.h"

using namespace std;

//constructor
Black_White_Mandel::Black_White_Mandel(){
    max_iterations = 255;
}

//destructor
Black_White_Mandel::~Black_White_Mandel(){}

int Black_White_Mandel::compute_point("various arguments") {
    //code and stuff
    return 0;
}

void Black_White_Mandel::compute("various arguments") {
     //code and stuff
}

因此,Mandel.h 有 2 个函数必须实现,因为它们是虚拟的且“=0”。在 White_Black_Mandel_Imp1.cpp 中,当我实现那些编译器变得疯狂的函数时。它说这些函数没有在 White_Black_Mandel.h 中定义,虽然这是真的,但它们是在 Mandel.h 中定义的。因此,通过继承,White_Black_Mandel_Imp1.cpp 应该知道它有义务从 Mandel.h 中实现这些功能。

我不明白,我的一个 friend 说我的 White_Black_Mandel.h 文件应该是 Mandel.h 的精确拷贝,但有一些额外的东西,但这对我来说真的很愚蠢,没有意义。

我做错了什么?

最佳答案

虽然您的祖先类中有 2 个纯虚方法,但这并不意味着它们的原型(prototype)已准备好在子类中使用。

即使在子类中也必须声明原型(prototype):

class Black_White_Mandel: public Mandel {

public:
    virtual void compute("various arguments")

protected:
    int max_iterations; //a specific variable of this Black_White Version

private:
    virtual int compute_point("various arguments");
};

virtual 关键字是可选的,但了解该方法确实是虚拟的很有用。你不是被迫在这个特定的子类中实现它们,你可以避免指定任何东西但是你仍然有两个必须实现的纯虚拟方法所以你将无法实例化这个子类的任何对象(你将有无论如何在层次结构树中实现它们)。

需要虚拟析构函数,否则类似情况:

Base *derived = new Derived();
delete derived;

编译器无法调用正确的析构函数。

关于C++继承不继承祖父文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15422630/

相关文章:

c++ - 析构函数中的动态转换

c++ - 实现加权 BFS 以找到最短路径

c++ - 如何一次更新多个描述符集

c++ - 如何在 Google 测试中将 FRIEND_TEST 与 TYPED_TEST 结合使用?

delphi - 如何在兼容的方法指针之间进行转换?

haskell - 种类级别的括号是什么意思?

c++ - 将 C++/C 中的二维数组拆分为子数组

java - Java 8 中的默认实现 VS 继承方法

c++ - 继承 vector/数组/列表并更改其大小

c++ - 可能的继承范围问题 :