C++ 使用派生类初始化成员类
因此,我试图找到一种最佳实践方法,将成员类构造为其派生类的一部分C++ 使用派生类初始化成员类,c++,inheritance,C++,Inheritance,因此,我试图找到一种最佳实践方法,将成员类构造为其派生类的一部分 struct A { int a = 0 } struct B : struct A { int b = 0; } class ContainingClassA { ContainingClassA() : member_A(){} virtual A get() { return member_A; } A member_A; } class Contain
struct A {
int a = 0
}
struct B : struct A {
int b = 0;
}
class ContainingClassA {
ContainingClassA() : member_A(){}
virtual A get() {
return member_A;
}
A member_A;
}
class ContainingClassB : public ContainingClassA {
ContainingClassB(){}
virtual B get() override{
return member_A;
}
}
是否有一种方法可以初始化包含ClassB的类
中的成员a
,使其为B类型?我看到过,为了初始化成员a
,可能在包含classa的中添加了一个构造函数。我知道我可以在包含类B
中声明一个B member\u B
变量并返回它,但是由于B
是从a
派生出来的,因此我似乎可以以某种方式将它存储在继承的变量member\u a
中,您可以使用模板来选择变量的类型。大概是这样的:
#include <iostream>
struct A {
int a = 0;
};
struct B : A
{
int b = 0;
};
template<typename T>
class ContainingClassA
{
public:
ContainingClassA() : member_A(){}
virtual T get() {
return member_A;
}
T member_A;
};
class ContainingClassB : public ContainingClassA<B>
{
public:
ContainingClassB() { }
virtual B get() override
{
return member_A;
}
};
int main()
{
ContainingClassB cb;
std::cout << cb.get().a;
std::cout << std::endl;
std::cout << cb.get().b;
return 0;
}
#包括
结构A{
int a=0;
};
结构B:A
{
int b=0;
};
模板
类包含类A
{
公众:
ContainingClassA():成员_A(){}
虚拟T get(){
返回成员A;
}
T成员A;
};
类别包含类别B:公共包含类别A
{
公众:
包含类B(){}
虚拟B get()覆盖
{
返回成员A;
}
};
int main()
{
包含B类cb;
标准::cout
是否有一种方法可以初始化包含ClassB的类中的成员a
,使其为B类型
否。成员A
是包含类A
的成员包含类b
使用与其父类相同的成员A
,包含类A
。不能更改父类的布局
此外,您不能更改虚拟函数的声明(只有少数例外)。换句话说,您不能用bget()
覆盖a get()
您可以更改get()
以返回引用,然后可以使用B&get()
覆盖a&get()
(因为a&
和B&
是协变类型)
但首先,您需要将解决方案分为A和B的“接口”和两个“实现”:
#include <iostream>
struct A {
int a = 0;
};
struct B : public A {
int b = 1;
};
class ContainingClassBase {
public:
virtual const A& get() = 0;
};
class ContainingClassA : public ContainingClassBase {
A member_A;
public:
virtual const A& get() override { return member_A; }
};
class ContainingClassB : public ContainingClassBase {
B member_B;
public:
virtual const B& get() override { return member_B; }
};
int main() {
ContainingClassA a;
ContainingClassB b;
std::cout << a.get().a << std::endl;
std::cout << b.get().b << std::endl;
}
#包括
结构A{
int a=0;
};
结构B:公共A{
int b=1;
};
类包含类库{
公众:
虚拟常量A&get()=0;
};
类ContainingClassA:公共ContainingClassBase{
一名成员;
公众:
虚拟常量A&get()重写{return member_A;}
};
类ContainingClassB:公共ContainingClassBase{
B成员B;
公众:
虚拟常量B&get()重写{return member_B;}
};
int main(){
包含a类;
包含b类;
Std::Cub:B/<代码>包含<代码> < /COD>部分。<代码> a <代码>对“<代码> b <代码> > nNaulover AH没有知识或存储。当然,我很好奇,如果我在存储这些类的指针时不存储实例本身呢?考虑在基类中有一个指针,即<代码> A*成员。A、
您可以在ClassContainingB中为其分配一个B实例;有几种特定的方法允许您更改函数重写的返回类型:const A&get()
和const B&get()
或const A*get()
和const B*get()
将是这种“协变返回类型”的有效情况。