0

我尝试从另一个类复制构造函数。这两个类在同一个文件中。我目前得到的错误是:

错误:没有用于调用 B::B(A&) 的匹配函数

来自主文件的片段:

#include "file.h"
// create the objects
A object1(1000000, 5);
B object2(object1);

来自 file.cpp 的片段:

class A {
public:
    A::A(uint32_t one, uint32_t two) { }
};
class B : public A {
public:
    B::B(const B &copy) : A(copy) { }
 }

};

头文件文件的片段。

class B : public A {
public:
    B(const B&);

我试图让stackoverflow的代码尽可能简单。有人可以解释一下这里有什么问题吗?

4

2 回答 2

5

您的 B::B(const B&) 需要对 const B 的引用,但您提供的是 A 的实例。B 派生自 A 无关紧要;即使每个 B 都是 A,反过来也不成立。事实上,object1 是-a A,但 is-not-a B。

进一步澄清:如果您希望 B 可以从 A 构造,则需要提供一个采用 A 的构造函数,例如:B::B(const A& copyA): A(copyA) {}

于 2018-06-19T11:40:32.743 回答
2

Liskov 替换原理 wiki 页面说:

可替换性是面向对象编程中的一个原则,它指出,在计算机程序中,如果 S 是 T 的子类型,则类型 T 的对象可以替换为类型 S 的对象(即类型 T 的对象可以替换为任何子类型 S 的对象),而不改变程序的任何所需属性(正确性、执行的任务等)。

您可以使用 B 的对象而不是 A,但不能反转。

于 2018-06-19T11:39:00.307 回答