Skip to content

Instantly share code, notes, and snippets.

@blockspacer
Last active October 28, 2022 13:12
Show Gist options
  • Save blockspacer/ec33e309686a13b6e851b48db60c3dfb to your computer and use it in GitHub Desktop.
Save blockspacer/ec33e309686a13b6e851b48db60c3dfb to your computer and use it in GitHub Desktop.
C++ constructor order example in Static Polymorphism with Multiple Inheritance and Diamond Problem

About

https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGIM6SuADJ4DJgAcj4ARpjEIAAcAGykAA6oCoRODB7evv6p6ZkCIWGRLDFxSbaY9o4CQgRMxAQ5Pn5c1bVZDU0EJRHRsXoKjc2teR0jvf1lFRIAlLaoXsTI7BzmAMyhyN5YANQmm25OI8SYrEfYJhoAgls7e5iHx2wsJACeVzf3ZtsMuy8ByObjOoWA3zuPzOXgc%2B1uFiYSgAIkxGocAOwWQ53fZ4%2BGIlFopgQeaY7E/fFU/YjdAgFDLAgvNwgw5mMwIpGYVGNUnmMzM1n8kwAVjcDGFmysuPxJgxyJxtypAD9OUTeWS5RSZdSaQQ6QyvEyQUL2arCdziXz2YLjmyzKLxZLpUrZfLFXLkUcXdCCMRYUy1c8tYqqUGeUx9uhiVrPd7Kfig6TyaHdXqDWgjba3Pak/N%2Bdn7Y6Jez4zrMQqE3jzVzkyGq9TafTM8bjqazDWlNaBSa7cKxSWHVKG57U3iAG6oPDofb8VB1rFjxv65uMwv8oP0ufd9elgfOkfuhuT6f7EmaxcNqlNw2tll99mbkDngu9nP9p2l4fl0c/OPf%2B47hhOELAtCMUwbUCuQjBdtVdXUbxbXdLDAq18xtN8i33L8XSpX9y2VKD1XPCDy2vFdb2QwjUI1V82wfB1sKHXC3UrKF5TLQDbmApkiODS9yz48Do0aWMOIAqk%2BNgpdyIzNdMP5KT0J7ej3z3T9mMPNj4P2ajawvOC03TVcswUs0lLo%2B81MYjTOLwo9yxPGdtwMmT8UQ%2BTVPtPit1QedlOQ4sDx/BydKc/Yomkq93IopCzJQrl6UigL4qCnCtI9cSfSAv0A32NwVnOQRwPrcsCuIIqCBg1zorxDzTK8/lysq6rLPbNLNJC7SVWaxgqrQ0idNkky73bZVeuKtC2oYjq7NYzKvQA31/ThCamRAfYUi8KJaDwZACS5UhNu23b9r4waqTW4SYyxf8WLxNaorImK5Iaqz7UelLGvUwc5rxfCdPGwq%2BqeoaXpGqjPum6zZok1iGwAegR/ZUHHWJiGnTAFH2HyQGSsAwGPKcZ2Si603q0aGLWpKd1Spi/orBbOJ%2BUImRYJhQlghs1v2ZBgcEBm%2BYqvqADoXzhvEhcqkXksF/mCBFp8XLl4XBBF3HlYl3n5cVi16XF%2B7tdVhXcdlpb5Q4RZaE4EVeD8DgtFIVBOBZSxrBpZZVmDP4eFIAhNEtxYAGsQEkEURfiTYo%2BjmPo%2BSa2OEkO2A6dzheAUEAND9gPFjgWAYEQBkWBSOhYnISg0GL0u4l2QxgAAfVyhgg9ILBxz2zAADU8EwAB3AB5FJGE4X2aFoAhYgziAohTqJQiaD4U8rthBH7hhaEXh3eCwdmjHELfW7wc4HDwNGM4PzBVEwPmJ5T1mahT3aomIBePCwFO/TwFgR8tvgDGABQ3c%2B6D2HtwXg/BBAiDEOwKQMhBCKBUOoA%2BugOgGCMCgaw1h9B4CiBnSAixUApDqAwc%2BABaKgChDCZAAF6YCOKidA6BzgKGxuQhgqBSGoBYIQchL82CkLSPfYg%2BxSHAHTjUa%2BxCXAMHcJ4NoehgihAGOUIYHQ0gZGIeMdoBQNFZBmIMOIkwJEn3qKMFociJidEkd0Mx%2BiVGGNsGYrRwxbFKNmKoxYChPZrAWPoG2ycD7Ow4PsVQSRSGJEkLzNBwB9gQCbkHMkEBcCEBIGyTYXB5i8H9lveYwcQBRxFrHIpcc/GJ14N/EUWd7aOyCenTO2ccmkDzoXRkW0CDlwgJgfARAMZ0g6BA4QohxCwIGQgtQKcUGkF7i/FIP8rb%2BNINU3gQT%2B5GjaSjKgISwkRKiXXWJ8TEkeCrvQYRWwMlZJzosBAFwsBxFJKUpOpAKlVJTrU2w9TslaFyaQEOZgMQiw0JHYpMd46cE2AEmpacGlfKaQXZpEAkCVxLicjpSLq4gAAcwFICgECoHaW3DuQCB5D3tqPOgE9iBTxngfOezBiCb0dsvPqa8N4px3nXfejt8DH0cGfFOl9r5GnWI7e%2BCdHZPxfvSt%2BwqskY2/mAxYVB/6AJ7sS0Bo9ZBQOGdIUZShxnIPyNEjBbtLDYNwfAAhRCshkIoVQxwtD6FMEYcw1hVB2GcO4QQXhrBMACKnIIWIIixFWJMX4TpMjnEdEUaUAxeh1FFGyBY7R8biF2LmEYropjeiRpDcQnozQ02qMcdmpNLjphuNjRkpYKwfFVoTrbRZrzOBbMSOEyJwBkD7Tif6ZuiTkk9LSec6FgdSDXKdUMe5vz/mAuBSCh55SQCVMbYEqFGcs6fN/vCpArSjSoq4ci2I4QfWcFCa2nZHau0HN4F0lJvS9ADK1TAnVsgxlIMdroAI0ymCzIVaUhtSzU4cFWQQdZqBNmnrbfsC9%2Bye0JNiUcg9py/hmEycO75Y7bmUHmWUp5i6Xkro4HU9dlyfn%2BGnUC2dmxQUcHBcuyFhG0PYbMBC5ZUKN3fLRpSrIocgA%3D

In case of multiple inheritance, the constructors of inherited classes are called in the exact same order in which they are inherited and the destructors are called in the reverse order of constructors.

The ambiguity problem arises when a single class is derived from two or more parent classes having the same-named member functions. The ambiguity is shown by the derived class object which invokes one of the same-named functions.

Run result

ABaseData()
ABase()
BBaseData()
BBase()
CurrentData()
Current()
ABase::a()
Current::b()
ABase::foo()
BBase::foo()
ABase::a()
BBase::b()
~Current()
~CurrentData()
~BBase()
~BBaseData()
~ABase()
~ABaseData()
#include <iostream>
#include <memory>
#include <string>
struct ABaseData {
ABaseData() {
std::cout << "ABaseData()" << "\n";
}
~ABaseData() {
std::cout << "~ABaseData()" << "\n";
}
};
struct ABase {
ABaseData data{};
ABase() {
std::cout << "ABase()" << "\n";
}
~ABase() {
std::cout << "~ABase()" << "\n";
}
void foo() {
std::cout << "ABase::foo()" << "\n";
}
void a() {
std::cout << "ABase::a()" << "\n";
}
};
struct BBaseData {
BBaseData() {
std::cout << "BBaseData()" << "\n";
}
~BBaseData() {
std::cout << "~BBaseData()" << "\n";
}
};
struct BBase {
BBaseData data{};
BBase() {
std::cout << "BBase()" << "\n";
}
~BBase() {
std::cout << "~BBase()" << "\n";
}
void foo() {
std::cout << "BBase::foo()" << "\n";
}
void b() {
std::cout << "BBase::b()" << "\n";
}
};
struct CurrentData {
CurrentData() {
std::cout << "CurrentData()" << "\n";
}
~CurrentData() {
std::cout << "~CurrentData()" << "\n";
}
};
struct Current : public ABase, public BBase {
CurrentData data{};
Current() {
std::cout << "Current()" << "\n";
}
~Current() {
std::cout << "~Current()" << "\n";
}
// overrides BBase::b()!
void b() {
std::cout << "Current::b()" << "\n";
}
};
int main() {
Current current;
current.a();
current.b();
current.ABase::foo();
current.BBase::foo();
current.ABase::a();
current.BBase::b();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment