通过"基类的指针访问"到未在基类中声明的子类的方法或属性(动态)

时间:2017-12-03 20:54:36

标签: c++ class inheritance derived-class dynamic-cast

在我的C ++编程任务中( 继承 ),我不得不设计一个抽象类Shape,其中包含一些属性,如颜色,旋转度等等。形状之间的共同点但是,在实现Base类,如Circle,Rectangle和......时,我不得不添加一些属性,比如圆圈的中心(它自己需要它自己的setter和getter使它成为私有!)或4个角落矩形(带有setter和getter)在基类中没有被提及为函数(无论是否为虚函数)。

最初我想使用基类的指针来访问派生类的每个方法。在我的主要内容中,我使用了 我的基类的指针 ,Shape *将动态 绑定添加到常用方法和属性中,但是在设置单独时(衍生和基础之间不常见)属性,它不能通过基类的指针访问。我试图在我的Base类中将它们声明为虚函数,然而,它不起作用并且它也不合逻辑,因为用户可能在一个形状中具有许多特征! 有没有人知道如何解决这个问题? 以及如何使用Shape *访问那些仅在Derived类中声明的方法和属性? TNX

这是形状的基类。

class Shape
{
public:
    virtual void set_color(int color)=0;
    virtual void set_border_color(int border_color)=0;
    virtual void set_degree(float border_width)=0;
    virtual void set_border_width(double rotate_degree)=0;
    virtual void set_opacity(double opacity)=0;


protected:
    int color;
    int border_color;
    float border_width;
    double rotate_degree;
    double opacity;

};

分别是我的Circle和Rectangle类

圈子标题:

#ifndef CIRCLE_H
#define CIRCLE_H
#include "shape.h"



class Circle :public Shape
{
public:
     void set_color(int _color);
     void set_border_color(int _border_color);
     void set_degree(float rotate_degree);
     void set_border_width(double border_width);
     void set_opacity(double _opacity);

    virtual void set_x_center(int _x_center);
    virtual void set_y_center(int _y_center);
    virtual void set_radius(int _radius);
    virtual void set_name(std ::string _name);
     int get_color();
     int get_x_center();
     int get_y_center();
     std::string get_name();

private:

    int x_center;
    int y_center;
    int radius;
    std ::string name;

};

#endif // CIRCLE_H

循环CPP:

#include <sstream>
#include <iostream> 
#include <algorithm>
#include <string>
#include "circle.h"
#include "shape.h"


     void Circle::set_color(int _color){ color=_color;}
     void Circle::set_border_color(int _border_color){border_color=_border_color;}
     void Circle::set_degree(float _rotate_degree){rotate_degree=_rotate_degree;}
     void Circle::set_border_width(double _border_width){border_width=_border_width; }
     void Circle::set_opacity(double _opacity){opacity=_opacity;}
     int Circle::get_color(){return color;}

     void Circle::set_x_center(int _x_center){ x_center=_x_center;}
     void Circle::set_y_center(int _y_center){ y_center=_y_center;}
     void Circle::set_radius(int _radius){ radius=_radius;}
     void Circle::set_name(std ::string _name){ name=_name;}


     int Circle::get_x_center(){return x_center;}
     int Circle::get_y_center(){return y_center;}
     std::string Circle::get_name(){return name;}

矩形标题:

#ifndef RECT_H
#define RECT_H
#include <sstream>
#include <iostream> 
#include <algorithm>
#include <string>
#include "rect.h"
#include "shape.h"


class Rect : public Shape
{
public:
     void set_color(int _color);
     void set_border_color(int _border_color);
     void set_degree(float _border_width);
     void set_border_width(double _rotate_degree);
     void set_opacity(double _opacity);
     void set_first_point(int _first_x,int _first_y);
     void set_second_point(int _second_x,int _second_y);
     void set_name(std ::string _name);
private:

    int first_point [2];

    int second_point [2];
    std ::string name;

};



#endif // RECT_H

矩形CPP:

#include "rect.h"
#include "shape.h"


void Rect::set_color(int _color){ color=_color;}
void Rect::set_border_color(int _border_color){border_color=_border_color;}
void Rect::set_degree(float _border_width){border_width=_border_width;}
void Rect::set_border_width(double _rotate_degree){rotate_degree=_rotate_degree;}
void Rect::set_opacity(double _opacity){opacity=_opacity;}


void Rect::set_first_point(int _first_x,int _first_y){first_point[0]=_first_x;first_point[1]=_first_y;}
void Rect::set_second_point(int _second_x,int _second_y){second_point[0]=_second_x;second_point[1]=_second_x;}

void Rect::set_name(std ::string _name){name=_name;}

,这是我的主要

#include <cstdlib>
#include <vector>
#include <cmath>
#include <string>
#include <vector>
#include <cmath>
#include <sstream>
#include <iostream> 
#include <algorithm>
#include "shape.h"
#include "circle.h"
using namespace std;

int main()
{
Circle a;
Shape* b;
b=&a;

b->set_color(12);
b->set_x_center(30);
cout<< b->get_x_center();
return 0 ;
}

最初我想使用基类的指针访问派生类的每个方法。

1 个答案:

答案 0 :(得分:1)

您可以通过动态转换回Circle *

来实现
b->set_color(12);
dynamic_cast<Circle *>(b)->set_x_center(30);
std::cout << dynamic_cast<Circle *>(b)->get_x_center();

但是,当这样的动态投射确保结果不是nullptr

时,这已经有效了
b->set_color(12);
Circle *c = dynamic_cast<Circle *>(b);
if (c != nullptr)
{
    c->set_x_center(30);
    std::cout << c->get_x_center();
}