"Extend" C++结构
"Extend" Struct in C++
我说"extend",因为在谷歌搜索后,我不确定这是我想要完成的事情的适当名称。
基本上我要做的是创建一个结构体(只是为了好玩,让我们也包括类在这个问题),其中有一些空白变量,然后创建另一个结构体或类,继承父离开的地方,填充这些变量。
所以像这样:
struct parent{
int foo;
int bar;
};
struct daughter : parent{
foo=1;
bar=3;
};
struct son : parent {
foo=10;
bar=20;
int foobar;
};
之后,我可能需要进一步扩展这棵树:
struct grandson : son {
foo=50;
bar=900;
foobar=10000;
};
正确的做法是什么?
编辑:@Everyone:所以,我可以解释我在做什么,你可以用更好的方法来反驳它,谁知道呢,也许那些方法更好。然而,首先,我很好奇我所问的是否可能……
还有我没说的:
struct parent{
int foo;
int bar;
int foobar;
int add(int x, int y){
return x+y;
};
struct son : parent {
foo=12;
bar=13;
foobar=add(foo,bar);
}
我想你可能想使用构造函数来初始化这样的值。像这样:
struct daughter : public parent {
daughter() {
foo=1;
bar=3;
}
};
(顺便说一句,我知道"public"关键字不是必需的,我包含它只是因为我喜欢保持我的意图明确;否则我总是会想是不是我忘了指定它)
您的parent
和daughter
除了它们的初始类值之外本质上是相同的类型。grandson
和son
也一样。
为什么不为这个任务使用构造函数呢?
struct parent
{
parent () : foo(), bar() {}
parent (int the_foo, int the_bar)
: foo(the_foo), bar(the_bar) {}
int foo;
int bar;
};
struct son : public parent
{
son () : parent(10,20), foobar(foo+bar) {}
son (int the_foobar)
: parent(10,20), foobar(the_foobar) {}
int foobar;
}
int main ()
{
parent p;
parent daughter(1,3);
son s;
son grandson(10000);
}
我认为在这种情况下没有必要使用继承。如果您只想获得具有特定值的parent
实例,那么您可能只需要一个简单的函数:
parent get_daughter() {
// note that this syntax requires c++11
// in earlier standards you may want to add a constructor to the class
return {1, 3};
};
son
引入了一个新成员,所以继承是合适的。
在c++中,结构体被视为所有成员默认为public的类。
所以你可以得到你想要的行为。
然而,你需要使用构造函数来初始化变量,你不能像你写的那样直接做。
:
struct parent{
int foo;
int bar;
int foobar;
int add(int x, int y){
return x+y;
};
struct son : parent {
foo=12;
bar=13;
foobar=add(foo,bar);
需要写成
struct parent
{
int foo;
int bar;
int foobar;
int add(int x, int y){
return x+y;
};
};
struct son : parent
{
son()
{
foo = 12;
bar = 13;
foobar = add(foo,bar);
// or just: foobar = foo+bar;
}
};
但是在这种情况下,子元素和父元素实际上是同一个结构体的实例化。这是相当愚蠢的。您是否要向son添加更多字段,因为这就是继承的意义。在你的例子中,你的父亲和儿子是一样的,只是状态不同。另一方面,如果son需要保存其他数据,那么它需要继承。
而且,如果你打算通过添加方法来开始将结构体视为类,那么为什么不直接将它们定义为类呢?
我认为像java和c#这样的语言可能有一些局部对象初始化的工资定义。但是,根据我的说法,c++已经有了"最好"的方式来解释成员变量(不是静态的)初始化。只需在构造函数中执行即可。非常清晰,直观,不易出错。
-
不要使用
struct
来继承:使用class
来代替。这破坏了继承层次结构中的保护级别,因为结构体成员的默认隐私级别是public。C程序员在阅读c++代码时会假设结构体不是继承的,有方法等。 - 将所有成员设置为private(如果未被继承类修改)或protected(如果被继承类修改),以防止类的实例化器意外修改。
- 如果类可以被任何其他代码实例化,则使构造函数
public
以使类被实例化。
class parent{
protected:
int foo;
int bar;
public:
parent() {
foo = 0;
bar = 0;
}
};
class daughter : parent{
private:
public:
daughter() {
foo=1;
bar=3;
}
};
class son : parent {
private:
int foobar;
public:
son () {
foo=10;
bar=20;
foobar = 0;
}
};
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- "Extend" C++结构