0

简单地说,我无法从 Vector 中的对象调用非继承方法。

我正在使用 Qt Creator 2.7.0,据我所知,它还没有使用完整的 C++11(?) - 我不确定这是否是导致以下问题的原因(尽管我很确定是我不是 IDE/编译器):

我有 3 个从基类继承的类,每个类都有一个额外的原语/getter/setter。

简单地说,我的课程看起来像:

class A 
{
  public:
    virtual std::string getName() = 0 ;
    virtual void setName(std::string) = 0 ;
    virtual int getNumber() ;
    virtual void setNumber(int) ;
  protected:
    std::string name ;
    int number ;
}

class B : public A
{
  public:
    std::string getName() ;
    void setName(std::string) ;
    int getNumber() ;
    void setNumber(int) ;

    std::string getEmail() ;
    void setEmail(std::string) ;
  protected:
    std::string email ;
}

在我的主要我有一个指针向量,即:

std::vector<A*> contacts ;

//Add Pointers to Vector
A *a ;
B *b ;
contacts.push_back(a) ;
contacts.push_back(b) ;

然后我检查 Object Class Type,以确保它属于 B 类。

if (dynamic_cast<B*>(contacts.at(1)) != NULL) //nullptr not working in Qt yet
{

我可以访问 A 类的 getter 和 setter,但不能访问 B:

std::string name = contacts.at(1)->getName() ; //Works

std::string email = contacts.at(1)->getEmail() ; //Compiler Error: 'class A' has 
                                                 //no member named 'getEmail'

}

错误(“A 类”没有名为“getEmail”的成员)发生在编译时而不是运行时。

我看不出它是对象切片,因为这应该都是多态的,我应该使用某种类型的 C++ Casting吗?

任何帮助或朝正确方向踢球将不胜感激,谢谢。

4

3 回答 3

2

您需要使用 adynamic_cast来获取指向派生类型的指针。你实际上并没有这样做,你正在调用一个B方法A*

contacts.at(1)->getEmail() ; // look, no dynamic_cast

您需要执行与此等效的操作:

B* b = dynamic_cast<B*>(contacts.at(1));
std::string email = b ? b->getEmail() : "N/A";
于 2013-07-13T07:46:58.507 回答
0

联系人属于基类A。!您必须对派生的执行操作。!

而不是 contacts.at(1)->getName 使用 vector<B*> b->getName.

希望这能清除:)

于 2013-07-13T07:50:49.613 回答
0

您的contacts向量包含 A*。C++ 在编译时验证类型,因此在执行代码时没有问题。由于contacts是 A* 类型,因此只能调用 A 类的方法。在您的情况下,您想在可能是B或不是的对象上调用 B 方法!C++ 确定它是 a A,但它可能是 a C (如果 C 类继承自 A)。您想要做的是获取向量中 B 对象的实例并将其转换为 B 以便您可以调用该方法:B* b = dynamic_cast<B*>(contacts.at(1));现在可以使用b来做任何您想做的事情。

于 2013-07-13T08:02:47.730 回答