' P '

whatever I will forget

C++ Polymorphsim using Base class reference

ベース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* を指定する必要があるんですね。。

参照:

blog.livedoor.jp

www7b.biglobe.ne.jp