我有兩種相同方法的變體。我也有一個基類類型的實例,但我不知道它是一個實例的具體類。我現在想要根據對象的實際類型自動選擇適當的方法。這似乎是不可能的,唯一能解決的辦法是通過鑄造來檢查所有可能性。 雖然有一個更好的解決方案。基於類實例的自動方法選擇
這是我的小例子:
// Example program
#include <iostream>
#include <string>
#include <memory>
class A
{
public:
virtual void bar() const = 0;
};
class B : public A
{
public:
void bar() const
{
std::cout << "B.bar()" << std::endl;
}
};
class C : public A
{
public:
void bar() const
{
std::cout << "C.bar()" << std::endl;
}
};
class Z
{
public:
Z(int variable) : m_variable(variable) {};
void foo(std::shared_ptr<B> b)
{
std::cout << "Calling foo(B) method! " << m_variable << std::endl;
b->bar();
}
void foo(std::shared_ptr<C> c)
{
std::cout << "Calling foo(C) method!" << m_variable << std::endl;
c->bar();
}
private:
int m_variable;
};
int main()
{
std::shared_ptr<A> b(new B());
Z z(42);
//z.foo(b); // This doesn't work
// But this does
std::shared_ptr<B> b_cast = std::dynamic_pointer_cast<B>(b);
if (b_cast.get())
z.foo(b_cast);
}
目前,我不得不求助於dynamic_pointer_cast,但我覺得它有點醜,而不是非常維護。
我也不想將foo()
的功能添加到類B
和C
,因爲這些是許多其他類在其上運行的小型獨立數據結構。
非常感謝!
編輯:在原來的帖子我簡化了一下太多了。新的例子應該清除事情。
您是否聽說過多態性?你可以讓他們成爲虛擬成員函數並獲得這種行爲。 – NathanOliver
請注意,行'a = b;'導致切片。 (這裏沒有任何數據成員,但值得注意的是,這一行不會突然變成'B'。) – cdhowie
閱讀關於多態性,繼承,接口,虛函數和指針等的指針。 – Ron