Я сделал запрос для вас. Это даст вам рекурсивную категорию с одним запросом:
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
Если вы пытаетесь вызвать виртуальный метод из указателя базового класса, да.
Это полиморфизм.
Если вы спрашиваете, можете ли вы с указателем базового класса на производный класс вызвать метод базового класса, который переопределяется производным классом? Да, это также возможно, если явно указать имя базового класса:
basePtr-> BaseClass :: myMethod ();
Попробуйте:
class A { virtual void foo(); }
class B : public A { virtual void foo(); }
A *b = new B();
b->A::foo ();
Вы имеете в виду что-то вроде этого. (Где pBase
имеет тип «указатель на базу», но объект, на который указывает, на самом деле имеет тип Производный
, который является производным от Base
.)
pBase->Base::method();
Да, это возможно.
Нет. Не в чистом виде. Но да. Вам нужно выполнить некоторые манипуляции с указателем, получить указатель на vtable и выполнить вызов. но это не совсем указатель на базовый класс, а некоторая умная манипуляция указателем. Другой подход - использование оператора разрешения области видимости в базовом классе.
Да, но вы должны указать полное имя:
#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;
}
Если я правильно понимаю вопрос, у вас есть
class B
{
public:
virtual void foo();
};
class D: public B
{
public:
virtual void foo();
}
B* b = new D;
И вопрос Вы можете вызвать B :: foo ()
. Ответ положительный, используя
b->B::foo()
class B
{
public:
virtual void foo();
};
class D: public B
{
public:
virtual void foo();
}
B* b = new D;
Попробуйте вызвать
(*b).foo()
, чтобы вызвать функцию foo базового класса