これは、まだ問題を示している投稿可能な小さなサンプルです。
#include <iostream>
using namespace std;
#include <cstring>
class scary {
char is[31];
char sez[31];
public:
scary() {
strcpy(is, "Creep");
strcpy(sez, "boooo");
}
scary(const char i[], const char s[])
{
strcpy(is, i); strcpy(sez, s);
}
virtual void sayis(ostream &os) const { os << is; }
void saysez(ostream &os) const // this is NOT virtual!!
{ os << sez; }
};
ostream &operator<<(ostream &os, const scary &x) {
x.saysez(os);
os << ", said the ";
x.sayis(os);
return os;
}
class ghost: public scary {
public:
ghost():scary("Ghost", "Boo!")
{
}
};
class witch: public scary {
char extra[31];
public:
witch(): scary("Witch", "Toil and Trouble") {
strcpy(extra, "Double, Double");
}
void saysez(ostream &os) const {
os << extra << " ";
scary::saysez(os);
}
};
int main() {
scary s;
ghost g;
witch w;
cout << s << '\n' << g << '\n' << w << '\n';
return 0;
}
出力:
boooo, said the Creep
Boo!, said the Ghost
Toil and Trouble, said the Witch
witch
のコンストラクターで、配列を に設定しsez
、"Toil and Trouble"
次にsaysez
宣言された で出力し、出力するの関数を呼び出しwitch
ます。これは、非仮想メンバー関数をオーバーライドできる (推奨されません) ためです。extra
scary
saysez
sez