C++ 继承设计问题
c++ inheritance design issue
在 c++ 中,我想要一个抽象类型的数组 Query,它具有函数 calcScore()这是一个纯虚函数。
我有两个非抽象的类:ConQuery 和 DisQuery,它们实现了 calcScore 函数。
为此,我像这样定义数组:
vector<Query*> m;
我像这样迭代并调用函数:
for (vector<Query*>::const_iterator it1 = index.begin() ;it1 != index.end() ; it1++)
{
cout << (*it1)->CalcScore() << endl;
}
我在调用 Query 的纯虚拟函数时收到错误。如何通过多态类型调用 ConQuery 函数或 DisQuery 函数?谢谢。
仅当您尝试从该类型的构造函数或析构函数调用纯虚函数时,该错误才会发生在语言中(其中大多数派生类型尚未构建/已被销毁):
struct Query {
virtual void f() = 0;
Query() {
f(); // !!
}
~Query() {
f(); // !!
}
};
请注意,编译器通常将上面的代码标记为错误,但如果调用不直接在构造函数/析构函数中,则无法检测到它,例如,如果将对对象的引用传递给执行调用的其他函数。
你确定 CalcScore 是在 ConQuery 和 DisQuery 中实现的吗?我试过这个:
#include <iostream>
#include <vector>
class Query{
public:
virtual int CalcScore() = 0;
};
class Query2 : public Query
{
public:
virtual int CalcScore()
{
return 2;
}
};
class Query3 : public Query
{
public:
virtual int CalcScore()
{
return 3;
}
};
int main(int argc, char* argv[])
{
std::vector<Query*> m;
m.push_back(new Query2());
m.push_back(new Query3());
for (std::vector<Query*>::const_iterator it1 = m.begin() ;it1 != m.end() ; it1++)
{
std::cout << (*it1)->CalcScore();
}
}
它在我的VS2012下工作正常。
我也在我的一些项目中使用了大量次。
也许您尝试push_back查询项(而不是 con/dis)?
更改
for (vector<Query>::const_iterator it1 = index.begin() ;it1 != index.end() ; it1++)
自
for (vector<Query *>::const_iterator it1 = index.begin() ;it1 != index.end() ; it1++)
我可能错过了一些东西,但这对我有用:我已经知道我没有初始化等;-)
#include "stdafx.h"
#include <vector>
class Query
{
public:
int i;
void virtual CalcScore() = 0;
};
class ConQuery :public Query
{
public:
int i;
void virtual CalcScore() {i++;}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<Query*> index;
ConQuery b;
index.push_back(&b);
for (std::vector<Query*>::const_iterator it1 = index.begin() ;it1 != index.end() ; it1++)
{
(*it1)->CalcScore();
}
return 0;
}
相关文章:
- 混合组合和继承的C++问题
- 运算符继承和 cpp 核心准则 c.128 的问题
- 类继承,ENUM 与 AST 类实现的问题
- C++ 多级虚拟继承编译问题
- 如何解决此问题(基础模板和继承)
- 模板继承问题
- C++ 继承向量问题(无限循环+在其他类中使用向量的问题)
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 继承此C++代码有什么问题
- 一个关于继承和引用的C++问题
- C++继承和"常量"交互的问题
- 在钻石问题的求解中,为什么要虚拟地继承两次grand-parent类
- C++的抽象类继承和构造函数的问题
- C++:继承和列表函数作为类成员的问题
- SIGSEGV 因为基/派生类的继承问题
- 关于异常继承中的语法的问题
- C++继承的类设计问题
- 关于继承和覆盖的问题
- C++ 构造函数问题 // 继承的类
- 对复制构造函数的c++ OOP程序问题?继承