인공신경망 만들다가 막힌 부분이
추상클래스에 대한 상속클래스의 인스턴스에서 멤버함수 오버라이딩이 제대로 이루어지지 않았다는 점인데,
/******************************************************************************
Online C++ Compiler.
Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <iostream>
using namespace std;
class Parent
{
public:
virtual void call() {
printf("Hello Parent!\n");
}
};
class Child : public Parent {
public:
void call(){
printf("Hello Child!\n");
}
};
void importer(Parent* child){
child->call();
}
int main()
{
// Parent *A; // 가능
// Parent *A = new Parent(); //에러
Parent* A = new Child();
importer(A);
printf("Done.\n");
return 0;
}
main 1,2번째줄은 무시해도 좋다.
이 때, virtual 붙였기 때문에
Hello Child!
Done.
이 나온다.
만약, 부모클래스의 멤버함수 앞에 virtual 을 붙이지 않았다면, 실제로는 자식인스턴스를 가리키는 부모포인터의 해당 멤버함수를 호출했을 때,
자식메소드가 아니라 부모메소드가 그대로 나와버린다.
/******************************************************************************
Online C++ Compiler.
Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <iostream>
using namespace std;
class Parent
{
public:
// virtual void call() {
void call() {
printf("Hello Parent!\n");
}
};
class Child : public Parent {
public:
void call(){
printf("Hello Child!\n");
}
};
void importer(Parent* child){
child->call();
}
int main()
{
// Parent *A; // 가능
// Parent *A = new Parent(); //에러
Parent* A = new Child();
importer(A);
printf("Done.\n");
return 0;
}
Hello Parent!
Done.