C++ 混合泛型编程和多态性
我看过几篇关于泛型编程以及如何永远不要将虚拟函数和模板一起使用的文章。我理解这个习惯用法,因为模板是在编译时决定的,在编译时直到运行时才选择虚拟函数(过于简化) 然而,我有一些代码同时使用了OO风格和泛型风格,它似乎按照我想要的方式工作 我的问题: 是以下设计的不良做法。混合多态性和泛型代码 我的代码在下面是否有任何陷阱。(我知道我不应该继承数据成员,但我有:-/)C++ 混合泛型编程和多态性,c++,C++,我看过几篇关于泛型编程以及如何永远不要将虚拟函数和模板一起使用的文章。我理解这个习惯用法,因为模板是在编译时决定的,在编译时直到运行时才选择虚拟函数(过于简化) 然而,我有一些代码同时使用了OO风格和泛型风格,它似乎按照我想要的方式工作 我的问题: 是以下设计的不良做法。混合多态性和泛型代码 我的代码在下面是否有任何陷阱。(我知道我不应该继承数据成员,但我有:-/) \ifndef BaseTemplate\u H #定义基本模板 #包括 模板 类基模板{ 公众: typedef std::向量
\ifndef BaseTemplate\u H
#定义基本模板
#包括
模板
类基模板{
公众:
typedef std::向量pVT;
BaseTemplate(){}
虚拟~BaseTemplate(){};
虚空进程()=0;
const pVT&getContainer(){return m_pContainer;}
受保护的:
pVT m_p容器;
私人:
基本模板(常量基本模板和cpy);
BaseTemplate和运算符=(常量BaseTemplate和rhs);
};
#恩迪夫
我首先从基类继承,告诉基类模板在继承时想要什么类型。
这将允许我对多个类型进行两次继承,我希望在设计中将其分开
#ifndef DerClassA_H
#define DerClassA_H
#include <iostream>
#include "BaseTemplate.h"
class DerClassA: public BaseTemplate<int> {
public:
DerClassA(){}
virtual ~DerClassA(){}
virtual void Process(){
std::cout << "HELLO I AM: DerClassA" << std::endl;
}//This will push_back objects to m_pContainer
private:
DerClassA( const DerClassA& cpy );
DerClassA& operator=( const DerClassA& rhs);
};
#endif
#ifndef DerClassB_H
#define DerClassB_H
#include <iostream>
#include "DerClassA.h"
class DerClassB: public DerClassA {
public:
DerClassB(){}
virtual ~DerClassB(){}
virtual void Process(){
std::cout << "HELLO I AM: DerClassB" << std::endl;
}//This will push_back objects to m_pContainer
private:
DerClassB( const DerClassB& cpy );
DerClassB& operator=( const DerClassB& rhs);
};
#endif
#include "DerClassA.h"
#include "DerClassB.h"
int main()
{
BaseTemplate<int> *pClassA = new DerClassA();
pClassA->Process();
DerClassA *pClassB = new DerClassB();
pClassB->Process();
delete pClassA;
delete pClassB;
return 0;
}
\ifndef DerClassA\u H
#定义类a_H
#包括
#包括“BaseTemplate.h”
类DerClassA:公共基模板{
公众:
DerClassA(){}
虚拟~DerClassA(){}
虚空进程(){
标准::cout
下面的设计是不是很糟糕。混合多态性和泛型代码
不,有时候这样做是对的
我的代码在下面是否有任何陷阱
- 带有原始指针的容器
std::vector pVT;
看起来有点可疑
- 基类析构函数可能应该是纯虚拟的
- 我将使用C++11语法使该类不可复制
- 您只需要使基类不可复制
- 我不认为你的主要功能需要动态分配
其余的我看不到任何直接的错误
如果不知道您要做什么,就无法判断您的设计是否良好。指向指针向量的指针和空析构函数。这是一个更大的问题,我认为。@jrok Woops复制并粘贴实际代码失败。我将进行编辑。感谢我,如果我可以选择重新编写代码,我不会实现原始指针实际代码视图。共享指针适合我在这里的设计。关于C++11,我不知道这一点。有什么好的参考资料吗?我的软件包必须与Scientific linux配合使用,所以我的gcc编译器至少可以说是过时了(但这是另一个问题)@MWright是经过一些清理和注释后代码的样子。感谢一些不错的新c++11。我将对此进行研究。不过有一条注释-在main中。您没有使用多态性,这是我问题的全部重点,但它不会改变我知道的这个示例中的任何内容:-d没有理由使基类析构函数纯虚拟的。类已经是抽象的,因此必须在类之外定义析构函数的不便不会带来任何好处。(它确实需要是虚拟的,只是不纯粹)。
#ifndef DerClassA_H
#define DerClassA_H
#include <iostream>
#include "BaseTemplate.h"
class DerClassA: public BaseTemplate<int> {
public:
DerClassA(){}
virtual ~DerClassA(){}
virtual void Process(){
std::cout << "HELLO I AM: DerClassA" << std::endl;
}//This will push_back objects to m_pContainer
private:
DerClassA( const DerClassA& cpy );
DerClassA& operator=( const DerClassA& rhs);
};
#endif
#ifndef DerClassB_H
#define DerClassB_H
#include <iostream>
#include "DerClassA.h"
class DerClassB: public DerClassA {
public:
DerClassB(){}
virtual ~DerClassB(){}
virtual void Process(){
std::cout << "HELLO I AM: DerClassB" << std::endl;
}//This will push_back objects to m_pContainer
private:
DerClassB( const DerClassB& cpy );
DerClassB& operator=( const DerClassB& rhs);
};
#endif
#include "DerClassA.h"
#include "DerClassB.h"
int main()
{
BaseTemplate<int> *pClassA = new DerClassA();
pClassA->Process();
DerClassA *pClassB = new DerClassB();
pClassB->Process();
delete pClassA;
delete pClassB;
return 0;
}