是否有必要为该类实例派生另一个类?
如果我不这样做,我仍然可以访问它的方法,就像在这个例子中一样:
#include <iostream>
struct Class1 {
public:
void func();
};
struct Class2 : public Class1 {
// Class1 c1; <-- is this necessary?
};
void Class1::func(){
std::cout << "function called" << std::endl;
}
int main() {
Class2 c2;
c2.func();
}
我得到了预期的function called
但在某些示例中,我看到基类正在派生类中实例化:Class1 c1;
。它的用途是什么?
答案 0 :(得分:2)
是否有必要在类中实例派生另一个类?
不,绝对没有必要。
但在某些示例中,我看到基类正在派生类中实例化:
Class1 c1;
。它的用途是什么?
在不知道这些例子具体处理的内容 - 即那些类的语义是什么 - 以有意义的方式解释它们并不容易。但是,当您创建某种类型的数据成员时,您的对象具有该类型的子对象。所以当你这样做时:
struct Y { };
struct X
{
int a;
std::string b;
Y c;
};
X
类型的每个对象都有一个类型为a
的子对象int
,一个类型为b
的子对象b
和一个子对象{{1}类型为c
的}。您将使用点表示法访问它,如下所示:
Y
类似地,当类Y foo();
X x;
std::cout << x.a;
x.b = "Hello, World!";
X.c = foo();
派生自基类D
时,它包含类型为B
的子对象,并隐式继承B
的所有数据成员}:
B
现在,在您的情况下,除了struct B
{
int a;
std::string b;
};
struct D : B
{
bool c;
};
// ...
D d;
d.c = true;
d.b = "Hello, Base Class!";
d.a = 42;
派生之外,类Class2
还具有Class1
类型的数据成员。请注意,此数据成员不是Class1
的基础子对象,而是其他成员子对象。那是什么意思呢?
以一粒盐为例,但为了发展直觉,您可以认为继承模拟了“IS-A”关系,而数据成员关系模拟了“HAS-A”关系。
因此Class2
从Class2
公开派生的事实表明“所有Class1
个对象都是Class2
个对象”,因此继承Class1
数据成员。这解释了为什么Class1
类型的对象具有Class2
类型的基础子对象。
另一方面,Class1
具有类型Class2
的数据成员的事实模拟了“所有Class1
个对象包含/嵌入/拥有类型{{{ 1}}”。这解释了为什么类型为Class2
的对象具有Class1
类型的成员子对象。
现在在示例的特定情况下,您提到上述两种语义都是同时建模的 - 即Class2
IS-A和HAS-A Class1
- 但是没有必要。不是每个Class2
IS-A Class1
也是HAS-A thingy
。
我希望以抽象的方式对你有意义。设计是否正确主要取决于widget
和widget
对象的语义,以及它们的模型,但消息是:
如果
Class1
来自Class2
,则没有任何内容可以强制您将Class2
数据成员添加到Class1
。
答案 1 :(得分:0)
在这种情况下,派生类中不需要有基类成员变量。此外,多态性仅适用于指针和引用类型。
答案 2 :(得分:0)
不,没有必要。
class Base {
}
class Derived : public Base {
}
Derived
类将继承Base
类的成员。
答案 3 :(得分:0)
绝对没有必要。如果没有看到您所指的示例,则很难说出作者为何会创建该实例。最有可能的是显示当Class2 :: func()调用c1.func()时会发生什么。