Интервью на вопрос о виртуальных функциях в C ++

Я сделал запрос для вас. Это даст вам рекурсивную категорию с одним запросом:

SELECT id,NAME,'' AS subName,'' AS subsubName,'' AS subsubsubName FROM Table1 WHERE prent is NULL
UNION 
SELECT b.id,a.name,b.name AS subName,'' AS subsubName,'' AS subsubsubName FROM Table1 AS a LEFT JOIN Table1 AS b ON b.prent=a.id WHERE a.prent is NULL AND b.name IS NOT NULL 
UNION 
SELECT c.id,a.name,b.name AS subName,c.name AS subsubName,'' AS subsubsubName FROM Table1 AS a LEFT JOIN Table1 AS b ON b.prent=a.id LEFT JOIN Table1 AS c ON c.prent=b.id WHERE a.prent is NULL AND c.name IS NOT NULL 
UNION 
SELECT d.id,a.name,b.name AS subName,c.name AS subsubName,d.name AS subsubsubName FROM Table1 AS a LEFT JOIN Table1 AS b ON b.prent=a.id LEFT JOIN Table1 AS c ON c.prent=b.id LEFT JOIN Table1 AS d ON d.prent=c.id WHERE a.prent is NULL AND d.name IS NOT NULL 
ORDER BY NAME,subName,subsubName,subsubsubName

Вот скрипка .

20
задан Eli Bendersky 18 June 2010 в 05:02
поделиться

7 ответов

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

Это полиморфизм.

Если вы спрашиваете, можете ли вы с указателем базового класса на производный класс вызвать метод базового класса, который переопределяется производным классом? Да, это также возможно, если явно указать имя базового класса:

basePtr-> BaseClass :: myMethod ();

50
ответ дан 29 November 2019 в 22:29
поделиться

Попробуйте:

class A            { virtual void foo(); }
class B : public A { virtual void foo(); }

A *b = new B();
b->A::foo ();
16
ответ дан 29 November 2019 в 22:29
поделиться

Вы имеете в виду что-то вроде этого. (Где pBase имеет тип «указатель на базу», но объект, на который указывает, на самом деле имеет тип Производный , который является производным от Base .)

pBase->Base::method();

Да, это возможно.

10
ответ дан 29 November 2019 в 22:29
поделиться

Нет. Не в чистом виде. Но да. Вам нужно выполнить некоторые манипуляции с указателем, получить указатель на vtable и выполнить вызов. но это не совсем указатель на базовый класс, а некоторая умная манипуляция указателем. Другой подход - использование оператора разрешения области видимости в базовом классе.

-1
ответ дан 29 November 2019 в 22:29
поделиться

Да, но вы должны указать полное имя:

#include <iostream>

struct base { 
    virtual void print() { std::cout << "Base"; }
};

struct derived : base {
    virtual void print() { std::cout << "Derived"; }
};

int main() { 
    base *b = new derived;
    b->base::print();
    delete b;
    return 0;
}
10
ответ дан 29 November 2019 в 22:29
поделиться

Если я правильно понимаю вопрос, у вас есть

class B 
{
public: 
    virtual void foo();
};

class D: public B
{
public:
    virtual void foo();
}

B* b = new D;

И вопрос Вы можете вызвать B :: foo () . Ответ положительный, используя

b->B::foo()
5
ответ дан 29 November 2019 в 22:29
поделиться
class B 
{
public: 
    virtual void foo();
};

class D: public B
{
public:
    virtual void foo();
}

B* b = new D;

Попробуйте вызвать

(*b).foo()

, чтобы вызвать функцию foo базового класса

0
ответ дан 29 November 2019 в 22:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: