C ++如何使用子类调用函数,具有超类指针
c++ how to call function with subclass, having superclass pointer
我有3个类,A,B和C:
class A {
public:
virtual bool sm(B b) = 0;
virtual bool sm(C c) = 0;
};
class B : public A {
bool sm(B b) {
//code
}
bool sm(C c) {
//code
}
};
class C : public A {
bool sm(B b) {
//code
}
bool sm(C c) {
//code
}
};
和vector<A*> objects
,存储B或C对象。(例如,它们是随机生成的)
我可以以某种方式打电话吗
for(int i = 0; i < objects.size(); i++) {
for(int j = i; j < objects.size(); j++) {
objects[i].sm(objects[j]);
}
}
没有动态演员什么的?因为可以有更多的B-C类
这是一个袋子的事情,也许有更好的方法可以做到这一点吗?
溶液
正如odelande
所说,我理解,这是我问题的解决方案
#include <iostream>
#include <vector>
class B;
class C;
class A {
public:
virtual bool sm(A* a) = 0;
virtual bool sm(B* b) = 0;
virtual bool sm(C* c) = 0;
};
class B : public A {
public:
bool sm(A* a) {
return a->sm(this);
}
bool sm(B* b) {
std::cout << "In B doing B" << std::endl;
return true;
}
bool sm(C* c) {
std::cout << "In B doing C" << std::endl;
return false;
}
};
class C : public A {
public:
bool sm(A* a) {
return a->sm(this);
}
bool sm(B* b) {
std::cout << "In C doing B" << std::endl;
return true;
}
bool sm(C* c) {
std::cout << "In C doing C" << std::endl;
return false;
}
};
int main() {
std::vector<A*> objects;
objects.push_back(new B());
objects.push_back(new C());
objects[0]->sm(objects[0]);
objects[0]->sm(objects[1]);
objects[1]->sm(objects[0]);
objects[1]->sm(objects[1]);
std::cin.get();
return 0;
}
此代码输出
在 B 做 B
在 C 中做 B
在 B 做 C
在 C 中做 C
你不能
这样做。sm()
方法的重载是静态解决的,即在编译时(此外,sm()
应该将指针指向B
和C
)。但编译器只知道objects[j]
是A*
;它无法解析调用,因为没有将A*
作为输入的重载。
您想要的是根据运行时类型调度调用 objects[j]
。这就是对虚函数的调用的作用。因此,您应该只有一个sm()
方法,而该方法又应该调用其参数的另一个虚拟方法。
您正在搜索访客模式,多次调度。关键是你在sm(A&a)中引用并调用smT(...)在上面。(代码仅用于示例目的,需要清理和常量。
class A {
protected:
virtual bool smB(B& b) = 0;
virtual bool smC(C& c) = 0;
public:
virtual bool sm(A& a) = 0;
};
class B : public A {
protected:
bool smB(B& b) {
// code,
}
bool smC(C& b) {
// code
}
public:
bool sm(A& a) {
a.smB( *this ); // this is smC(...) in class C
}
};
相关文章:
- C++图形类指针混淆
- 如何使用基类指针引用派生类成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 模板转换为超类
- 使用基类指针调用基类的值构造函数的语法是什么?
- 如何在基类指针向量的元素上应用重载的多态函数
- 我的超类中的模板问题与结构定义
- 将类指针类型转换为键时出错
- 给定一个指向对象的超类指针,如何获取对象的大小?
- 确保指向超类的指针指向c++中某个子类的对象
- 创建一系列超类的指针,以分配继承的类
- C ++如何使用子类调用函数,具有超类指针
- 强制接收实现接口的超类指针作为方法的参数
- C++-使指向超类的指针与函数中的子类参数匹配
- C++查找带有指向超类的指针的子类的类型
- 当对象不是动态分配的(不是指针)时,是否可以从超类对象转换到子类
- 如何调用一个方法,该方法需要一个子类对象,该子类对象由指向其超类的指针引用
- 为什么我们需要一个超类的指针指向子类的对象?
- 当超类持有指向X的指针,而子类持有指向Y:X的指针时
- 从超类指针复制对象