You have learned from day-07 about c++ inheritance. A c++ class can not only inherit one class, but also inherit more than one class. If a c++ class is derived from at least two classes, that is multiple inheritance.
Any one of C, D, E, F declarations are multiple inheritance, as any one of them is derived from at least two classes.
class A {}; class B {}; class C: public A, public B {}; class D: public A, protected B {}; class E: private A, private B {}; class F: public A, protected B, private C {};
There is no multiple inheritance here. Although A is inherited by many classes, it is still single inheritance.
class A {}; class B: public A {}; class C: protected A {}; class D: private A {};
If a class is derived from multiple classes which are derived from the same class, that is diamond inheritance.
class A {}; class B: public A {}; class C: public A {}; class D: public B, public C {};
B and C are derived from the same class A, D is derived from B and C, that's diamond inheritance.
If method overloading (the same method name) happens on many classes of inheritance, the class_name::method_name can be used to distinguish them when that method is called.
For example:
namespace my_space::diamond { class A { public: void fz_k() const {} void fz_j() const {} }; class B { public: void fz_k() const {} }; class c_class: public A, public B { public: void eater() const { A::fz_k(); // A:: is used here to distinguish. B::fz_k(); // B:: is used here to distinguish. fz_j(); // A::fz_j() can be used here too, but only A has fz_j, so A:: can be omitted. } }; } // namespace my_space::diamond int main() { auto object = my_space::diamond::c_class{}; }
(You have learned method const
, namespace
from day-11)
#include <iostream> namespace my_space::diamond { class base_class { public: void gy_p() const { std::cout << "base_class gy_p" << std::endl; } }; class derived_1: public base_class { public: void gy_p() const { std::cout << "derived_1 gy_p" << std::endl; } }; class derived_2: public base_class { public: void gy_p() const { std::cout << "derived_2 gy_p" << std::endl; } void gy_r() const { std::cout << "derived_2 gy_r" << std::endl; } }; class diamond_class: public derived_1, public derived_2 { public: void w_p() const { derived_1::gy_p(); derived_2::gy_p(); // base_class::gy_p(); // Ambiguous error here, this will be talked next derived_2::gy_r(); gy_r(); // same, gy_r is only declared in derived_2 } }; } // namespace my_space::diamond int main() { auto diamond = my_space::diamond::diamond_class{}; diamond.w_p(); }
output:
derived_1 gy_p derived_2 gy_p derived_2 gy_r derived_2 gy_r
Written on Oct 31, 2024
c++ std::exception:
std::cout.write(err.data(), err.size());
std::cout << std::endl;
caught:
================================================== # The c++ programming language. # # # # Home: cppfx.xyz # # Join c++ Discord: yZcauUAUyC # # Deck # ==================================================