C ++: есть ли способ указать обобщенный класс, который наследуется от другого? - PullRequest
1 голос
/ 31 марта 2012
class Vec
{
    double dim[];
public:
    Vec(void);
    ~Vec(void);
    virtual void Add(Vec vector) = 0;

};

Я хочу заменить Vec в Vec::Add() на «любой класс, который наследуется от Vec». Есть ли способ сделать это?

Ответы [ 3 ]

5 голосов
/ 31 марта 2012

Измените параметр на ссылку на const Vec:

virtual void Add(Vec const &vector) = 0;

Класс (публично), полученный из Vec, может быть передан посредством ссылки на базовый класс.

Также,поскольку вы, очевидно, планируете использовать Vec в качестве базового класса, вы, вероятно, захотите сделать его dtor виртуальным.В противном случае, если вы попытаетесь уничтожить объект производного типа с помощью указателя или ссылки на базу, вы получите неопределенное поведение.

2 голосов
/ 31 марта 2012

Да, вы передаете указатель или ссылку на Vec:

 class Vec
{
    double dim[];
public:
    Vec(void);
    ~Vec(void);
    virtual void Add(Vec* vector) = 0;

};

Преобразование из указателя в class, производное от Vec в Vec*, является неявным.

Если вы передадите по значению, вы столкнетесь с нарезкой объектов, и поведение будет не таким, как вы ожидаете.

2 голосов
/ 31 марта 2012

Используйте константную ссылку на Vec или указатель на Vec

class Vec
{
    double dim[];
public:
    virtual void Add(const Vec& vector) = 0;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...