C++ 属性';在C+中使用继承进行s类型更改+;

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

我有一个类a,处理特定类型的对象(其中的实例)。我希望有一个类B,它大部分(也就是说,不是所有的方法都相同)都有相同的行为,但是它处理不同的对象类(B)

以下是我尝试过的:

#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我一点也不知道老实说,你想解决什么问题。