質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

2回答

3787閲覧

log4cppのログ出力内容について(オーバーライド)

KTMEI

総合スコア44

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2017/01/06 06:33

C++初心者です。
ほぼ触ったことがないので、細かい部分も教えていただきたいです。

C++を使用して試しにログを出力するプログラムを作成しています。
以下のサイトを参考にlog4Cppで作成しております。

http://qiita.com/hsagae/items/d7b0cf6ee876b636b3b9

以下のソースを実行して「Storm is coming」「This is Base」「This is Derived」
というログを出力させたいです。

理解が乏しく自身をもって言えてないですが、オーバーラードしているので、
問題ないと思っていたのですが、「This is Derived」のメッセージが出力されず、
「This is Base」が2回連続で出力されてしまいます。

オーバーライドの実装の仕方が間違えているのでしょうか。
どの箇所を直せばいいか修正箇所と修正サンプルを教えて
いただけないでしょうか。

以下ソースです。

■ConsoleApplication4.cpp

C++

1#include "stdafx.h" 2#include "Log.h" 3#include "Base.h" 4#include "Derived.h" 5 6int _tmain(int argc, _TCHAR* argv[]) 7{ 8 log4cpp::Category& logger = Log::getLogger(); 9 10 logger.warn("Storm is coming"); 11 12 Base* pBase = new Base(); 13 Base* pDerived = new Derived(); 14 15 pBase->printLog(); 16 pDerived->printLog(); 17 18 logger.shutdown(); 19 20 delete pDerived; 21 delete pBase; 22 23 return 0; 24}

■Log.h

C++

1#pragma once 2#include<log4cpp/Category.hh> 3#include<log4cpp/PropertyConfigurator.hh> 4 5class Log 6{ 7private: 8 Log(); 9public: 10 ~Log(); 11 static log4cpp::Category& getLogger(); 12};

■Log.cpp

C++

1#include "stdafx.h" 2#include "Log.h" 3Log::Log() 4{ 5} 6Log::~Log() 7{ 8} 9log4cpp::Category& Log::getLogger() 10{ 11 12 std::string initFileName = "log4cpp.properties"; 13 log4cpp::PropertyConfigurator::configure(initFileName); 14 return log4cpp::Category::getRoot(); 15}

■Base.h

C++

1#pragma once 2 3class Base 4{ 5public: 6 Base(); 7 ~Base(); 8 void printLog(); 9};

■Base.cpp

C++

1#include "stdafx.h" 2#include "Log.h" 3#include "Base.h" 4 5Base::Base() 6{ 7} 8 9Base::~Base() 10{ 11} 12 13void Base::printLog() 14{ 15 log4cpp::Category& logger = Log::getLogger(); 16 17 logger.info("This is Base"); 18}

■Derived.h

C++

1#pragma once 2#include "Base.h" 3 4class Derived : public Base 5{ 6public: 7 Derived(); 8 ~Derived(); 9 void printLog(); 10};

■Derived.cpp

C++

1#include "stdafx.h" 2#include "Log.h" 3#include "Derived.h" 4 5Derived::Derived() 6{ 7} 8 9 10Derived::~Derived() 11{ 12} 13 14void Derived::printLog() 15{ 16 log4cpp::Category& logger = Log::getLogger(); 17 18 logger.info("This is Derived"); 19}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

オーバーライドの実装の仕方が間違えているのでしょうか。

ですね。
printLog()関数が通常の関数ですので、基底クラス経由で呼び出すと普通に基底クラスのprintLog()関数が呼ばれます。
仮想関数にして下さい。Base.hのvoid printLog();virtual void printLog();とすれば良いです。
基底クラス側で仮想関数にしておけば、派生クラス側の同じメンバ関数はvirtualを付けても付けなくても仮想関数になります。

投稿2017/01/06 06:41

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KTMEI

2017/01/06 08:17

理解不足を実感し、今回教えていただいた内容を元にネット検索でも オーバーライドについて理解がさらに深めることが出来ました。 ありがとうございました。
guest

0

class Base { public: Base(); ~Base(); void printLog(); // ココが間違い。正しくは virtual void printLog(); };

投稿2017/01/06 06:38

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KTMEI

2017/01/06 08:17

理解不足を実感し、今回教えていただいた内容を元にネット検索でも オーバーライドについて理解がさらに深めることが出来ました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問