C ++ Полиморфизм, неполное снижение - PullRequest
0 голосов
/ 11 декабря 2011

У меня есть массив, который содержит ссылки на простой базовый тип, назовем его Object.

Я получил Class1 из Object и Class2 из Class1.

#include <vector>

class Object {};
class Class1 : public Object {
public:
virtual std::string ToString() {return "it is 1";}
};
class Class2 : public Class1 {
public:
    virtual std::string ToString() {return "it is 2";}
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<Object *> myvec;
    myvec.push_back(new Class2());
    printf("%s", (static_cast<Class1*>(myvec[0]))->ToString().c_str());
    return 0;
}

Я вызываю ToString(), передавая от Object * до Class1 * примерно так

    printf("%s", (static_cast<Class1*>(myvec[0]))->ToString().c_str());

Мой вопрос, будет ли это выводить 1 или 2, когда объект на самом делеClass2 но не специально для этого?Имеет ли ключевое слово virtual ожидаемый эффект?

Ответы [ 3 ]

3 голосов
/ 11 декабря 2011

Он должен вызывать виртуальную функцию Class2, поскольку объект этого типа.

Помните: целью виртуальной функции является вызов функции фактического класса, а не функции для класса, указатель / ссылка которого в настоящее время выглядит.

2 голосов
/ 11 декабря 2011

Я немного неправильно понял ваш вопрос, когда я впервые ответил, относительно демонов и ваших ноздрей.

Ключевое слово virtual будет иметь ожидаемый эффект. То есть вы увидите 2. Несмотря на то, что вы произвели Class1, виртуальная таблица будет работать как волшебство.

1 голос
/ 11 декабря 2011

Во-первых, это не безопасный актерский состав. Но если предположить, что myvec[i] является указателем на объект, к которому вы приводите объект, то он вызовет соответствующий метод для этого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...