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;
}
此代码输出
In B doing B
In C doing B
In B doing C
In C doing C
你不能这样做。 sm()
方法的重载是静态解析的,即在编译时(此外,sm()
应该采用 pointers 到 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
}
};
我有 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;
}
此代码输出
In B doing B
In C doing B
In B doing C
In C doing C
你不能这样做。 sm()
方法的重载是静态解析的,即在编译时(此外,sm()
应该采用 pointers 到 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
}
};