ベースClassのリファレンスに派生クラスをつっこむと、派生クラスの中を参照することができる、ということだ!
#include <iostream> class Base { public: virtual void say_hello() const{ std::cout << "this is Base class object" << std::endl; } virtual void say_word (const char* word) const{ std::cout << "In Base class object" << std::endl; std::cout << word << std::endl; } virtual ~Base() {} }; class Derived: public Base { public: virtual void say_hello() const { std::cout << "this is Derived class object" << std::endl; } virtual void say_word (const char* word) const{ std::cout << "In Derived class object" << std::endl; std::cout << word << std::endl; } virtual ~Derived() {} }; void what_did_you_say(Base &base, const char* word){ base.say_word(word); } int main(){ Base b; Base &ref1 = b; Derived d; Base &ref2 = d; ref1.say_hello(); ref2.say_hello(); what_did_you_say(b, "ah"); what_did_you_say(d, "ugh"); return 0; }
結果
this is Base class object this is Derived class object In Base class object ah In Derived class object ugh
というか、ポリモーフィズム全く関係ないところで、超基本的なところでハマりました。
(基礎がまだやっぱり全然理解できていない。。。)
"文字列" ->ってしちゃうとchar型配列になるんですよね。
これを関数に渡す際に、ただ単にchar型を指定していると、、
error: no matching function for call to 'what_did_you_say'
candidate function not viable: no known conversion from 'const char [3]' to 'char' for 2nd argument
と怒られました。もともとダブルクオーテーションで囲った文字列はリテラル文字列となり、基本的には変更不可の静的データとなります。
リテラル文字列は配列で、かつアドレスを返すので、関数に渡す際はアドレスを参照してもらわないといけない。
なのでconst char* を指定する必要があるんですね。。
参照: