C++ 属性';在C+中使用继承进行s类型更改+;
我有一个类a,处理特定类型的对象(其中的实例)。我希望有一个类B,它大部分(也就是说,不是所有的方法都相同)都有相同的行为,但是它处理不同的对象类(B) 以下是我尝试过的:C++ 属性';在C+中使用继承进行s类型更改+;,c++,inheritance,C++,Inheritance,我有一个类a,处理特定类型的对象(其中的实例)。我希望有一个类B,它大部分(也就是说,不是所有的方法都相同)都有相同的行为,但是它处理不同的对象类(B) 以下是我尝试过的: #include <iostream> #include <vector> class A { public: virtual void perform() { data.push_back(A()); }; std::vector<A> data; }; class
#include <iostream>
#include <vector>
class A
{
public:
virtual void perform() { data.push_back(A()); };
std::vector<A> data;
};
class B : protected A
{
public:
B() : A() {}
void test() { perform(); }
std::vector<B> data;
};
int main()
{
B b;
b.test();
std::cout << b.data.size() << std::endl;
}
// output: 0
// I expected: 1
#包括
#包括
甲级
{
公众:
虚拟void perform(){data.push_back(A());};
std::矢量数据;
};
B类:受保护的A类
{
公众:
B():A(){}
无效测试(){perform();}
std::矢量数据;
};
int main()
{
B B;
b、 test();
std::cout当您需要不同类型的相同行为时,请使用模板:
template <typename Element>
class Container
{
public:
void perform() { data.push_back(Element()); };
std::vector<Element> data;
};
int main(){
Container<A> a;
Container<B> b;
a.perform();
b.perform();
std::cout << a.data.size() << std::endl;
std::cout << b.data.size() << std::endl;
}
模板
类容器
{
公众:
void perform(){data.push_back(Element());};
std::矢量数据;
};
int main(){
容器a;
容器b;
a、 执行();
b、 执行();
std::cout当您需要不同类型的相同行为时,请使用模板:
template <typename Element>
class Container
{
public:
void perform() { data.push_back(Element()); };
std::vector<Element> data;
};
int main(){
Container<A> a;
Container<B> b;
a.perform();
b.perform();
std::cout << a.data.size() << std::endl;
std::cout << b.data.size() << std::endl;
}
模板
类容器
{
公众:
void perform(){data.push_back(Element());};
std::矢量数据;
};
int main(){
容器a;
容器b;
a、 执行();
b、 执行();
STD::C++中基于继承的多态性只处理函数,而不是数据元素。也就是说,改变对象的类型只影响调用哪个函数,而不使用哪个数据元素。
此外,您不能将A
类型的对象分配给B
类型的容器。忽略多态性,您不能执行以下操作:
std::vector<B> data;
data.push_back(A());
<>基于C++的继承型多态只处理函数,而不是数据元素。也就是说,改变对象的类型只影响调用哪个函数,而不使用哪个数据元素。
此外,您不能将A
类型的对象分配给B
类型的容器。忽略多态性,您不能执行以下操作:
std::vector<B> data;
data.push_back(A());
如果你真的需要推回实际的B,就制作一个A类模板。我正在考虑模板化这个类,它感觉就像是手工执行继承的工作。另外,如果我想实例化A或B中的任何一个呢?比如:A*var=new A();
或A*var=new B()
?我的错,那代码应该更好。如果你真的需要把实际的B放回去,就做一个A类模板。我在考虑模板化这个类,感觉就像是手工执行继承的工作。另外,如果我想实例化A或B中的任何一个呢?比如:A*var=new A();
或A*var=new B()
?我的错,那代码应该更好。好吧,我明白了。所以我唯一的解决方案是dario_ramos给出的,它正在模板化我的类?@Thomas老实说,我一点也不知道你到底想解决什么。好吧,我明白了。所以我唯一的解决方案是dario_ramos给出的,它正在模板化我的类?@Thomas我一点也不知道老实说,你想解决什么问题。