プログラム
|
#include <iostream>
class base { public: base() { std::cout << "base::base()" << std::endl; } base(int a) { std::cout << "base::base(" << a << ")" << std::endl; } virtual ~base() {} };
class derived : virtual public base { public: derived() { std::cout << "derived::derived()" << std::endl; } derived(int a) : base(a) { std::cout << "derived::derived(" << a << ")" << std::endl; } };
class more_derived : virtual public derived { public: more_derived() { std::cout << "more_derived::more_derived()" << std::endl; } more_derived(int a) : derived(a) { std::cout << "more_derived::more_derived(" << a << ")" << std::endl; } };
template<typename T> void func(const T&) { std::cout << "func()" << std::endl; } template<> void func<derived>(const derived&) { std::cout << "func<derived>()" << std::endl; }
int main(int argc, const char* argv[]) { func(base(1)); std::cout << "----------" << std::endl; func(derived(2)); std::cout << "----------" << std::endl; func(more_derived(3));
return 0; } |
※記述ミス(不足)を赤字で修正しました
実行結果
|
base::base(1) func() ---------- base::base(2) derived::derived(2) func() ---------- base::base() derived::derived(3) more_derived::more_derived(3) func() |
・仮想継承したときには明示的に先祖クラスのコンストラクタを指定していない場合デフォルトコンストラクタが呼ばれる
・親クラスで特殊化されていても派生クラスには適用されない
今まで知らずに使っていることはあっても殆ど自分で書くことのない機能だったから知らんかった。