Свързани въпроси 'virtual-inheritance'

Виртуално наследяване от базов клас
AFAIK, виртуалното наследяване решава проблема с диаманта, но какво ще стане, ако използвам виртуално просто за наследяване от базов клас? Каква е разликата с използването на virtual тук? class A { /* ... */ }; class B : virtual public A...
184 изгледи
schedule 24.09.2022

Неявно извикване на конструктор на недостъпен виртуален базов клас
Разгледайте кода по-долу. И g++, и clang++ се оплакват (правилно), че конструкторът A(int) е частен в клас D . Имайте предвид, че тъй като A е виртуален базов клас на D , A трябва да се инициализира в mem-initializer на клас D ,...
849 изгледи
schedule 23.09.2022

Виртуално наследство - Проблем с диаманти - Какво наистина се случва
Разбирам и съм чел достатъчно за проблема с диамантите, който се решава чрез виртуално наследяване. Въпросът ми тук е „Какво всъщност означава поставянето на виртуален до базов клас, от който бихте наследили“ class A { public: void Foo()...
196 изгледи
schedule 23.10.2022

Наследяване на конструктори и виртуални базови класове
На път съм да създам йерархия на клас изключение, която концептуално изглежда донякъде така: #include <iostream> #include <stdexcept> class ExceptionBase : public std::runtime_error { public: ExceptionBase( const char * msg ) :...
1323 изгледи

Елиминирайте дублиращите се записи от C++11 променливи аргументи на шаблона
Използвам променливи шаблони с множествено виртуално наследяване в C++, за да агрегирам типове в една дефиниция на структура. Ето примерен набор от структури: struct meas { int i; }; struct meas2 : public virtual meas { int j; }; struct meas3 :...
2598 изгледи

Защо static_cast не може да се използва за прехвърляне надолу, когато е включено виртуално наследяване?
Разгледайте следния код: struct Base {}; struct Derived : public virtual Base {}; void f() { Base* b = new Derived; Derived* d = static_cast<Derived*>(b); } Това е забранено от стандарта ( [n3290: 5.2.9/2] ), така че кодът не...
18734 изгледи

Виртуални таблици и оформление на паметта в множествено виртуално наследяване
Помислете за следната йерархия: struct A { int a; A() { f(0); } A(int i) { f(i); } virtual void f(int i) { cout << i; } }; struct B1 : virtual A { int b1; B1(int i) : A(i) { f(i); } virtual void f(int i) { cout <<...
7165 изгледи