Bef*_*rem 5 c++ oop inheritance
我有一个简单的C++基类,派生类示例.
// Base.hpp
#pragma once
class Base
{
public:
virtual float getData();
virtual void setData(float a, float b);
virtual void setData(float d);
protected:
float data;
};
//Base.cpp
#include "stdafx.h"
#include "Base.hpp"
float Base::getData()
{
return data;
}
void Base::setData(float a, float b)
{
setData(a);
}
void Base::setData(float d)
{
data = d;
}
//Derived.hpp
#pragma once
#include "Base.hpp"
class Derived
: public Base
{
public:
virtual void setData(float d);
};
//Derived.cpp
#include "stdafx.h"
#include "Derived.hpp"
void Derived::setData(float d)
{
data = d + 10.0f;
}
Run Code Online (Sandbox Code Playgroud)
如果我现在指向Base,那么编译就好了.
//Main.cpp
#include "stdafx.h"
#include "Base.hpp"
#include "Derived.hpp"
Base *obj = new Derived();
Run Code Online (Sandbox Code Playgroud)
但是如果我指向Derived类,那么编译器(VC 2008和2010)会抱怨:
Main.cpp(12): error C2660: 'Derived::setData' : function does not take 2 arguments
Run Code Online (Sandbox Code Playgroud)
以下是导致此错误的代码:
//Main.cpp
#include "stdafx.h"
#include "Base.hpp"
#include "Derived.hpp"
Derived *obj = new Derived();
Run Code Online (Sandbox Code Playgroud)
似乎隐藏了基类方法.我的印象是,由于基类方法是虚拟的,即使从Derived指针查看它们也应该是可见的,或者我错了?
Jar*_*Par 11
这是C++名称查找的工件.基本算法是编译器将从当前值的类型开始,然后继续执行层次结构,直到找到具有目标名称的类型的成员.然后,它将仅对具有给定名称的该类型的成员执行重载解析.它不考虑父类型上的同名成员.
解决这个问题的方法是重新定义函数Derived并将它们转发给它们Base
class Derived {
...
void setData(float a, float b);
}
void Derived::setData(float a, float b) {
Base::setData(a,b);
}
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用using声明将基本成员纳入范围
class Derived {
using Base::setData;
...
}
Run Code Online (Sandbox Code Playgroud)
有关此使用的文档