精华内容
下载资源
问答
  • C++判断一个类是否继承自另一个类

    千次阅读 2020-09-03 16:14:33
    派生继承基类的接口,所以我们经常会把一个基类派生出的多个派生当作同一个类别。在某些函数或者中,我们可能希望只支持某一类别的输入,即只支持某个类型或者这个类型的派生,此时就需要判断输入类型是否...

    前言

    派生类会继承基类的接口,所以我们经常会把一个基类派生出的多个派生类当作同一个类别。在某些函数或者类中,我们可能希望只支持某一类别的输入,即只支持某个类型或者这个类型的派生类,此时就需要判断输入类型是否继承自目标类型。

    考虑这样一种情形:线条(Line)由一系列点构成,而“点”可以有多种类型:圆点(Dot)、星点(Star)…,另外还有一种类型“平面”(Plane)则不是一种“点”,它们定义如下:

    class Point { };
    class Dot : public Point { };
    class Star : public Point { };
    class Plane { };
    
    template <typename Pt>
    class Line { };
    

    显然,线条可以由圆点或星点构成,但不能由平面构成,我们希望 Line 的模板参数 Pt 是一种 Point,如何在代码中进行判断呢?

    std::is_base_of

    C++11 提供了std::is_base_of(头文件<type_traits>)用于判断两个类型的继承关系,参考cppreference,使用方法为:

    std::is_base_of<A, B>::value; // get true if B is derived from A
    

    所以上述问题中,Line可以这么定义:

    template <typename Pt>
    class Line {
        static_assert(std::is_base_of<Point, Pt>::value,
            "template params MUST be Point!");
    };
    

    如果用户使用了错误的类型作为模板参数,比如 Line<Plane> line;,则会在编译时报错。

    基类带模板的情况

    点的坐标通常可以是多种类型的(int、float、double),下面我们给Point加上模板参数Scalar来支持不同类型数据:

    template <typename Scalar>
    class Point { };
    template <typename Scalar>
    class Dot : public Point<Scalar> { };
    template <typename Scalar>
    class Star : public Point<Scalar> { };
    template <typename Scalar>
    class Plane { };
    

    这时候你会发现std::is_base_of就不那么好用了,它会要求你提供PointPt的模板参数(即各自的Scalar),而且它会认为Scalar不同的两种 Point 没有继承关系!这往往并不是我们所希望的:

    std::is_base_of<Point<float>, Dot<float>>::value; // true
    std::is_base_of<Point<float>, Dot<double>>::value; // false
    


    针对这种情况,我在stackoverflow@Jarod42的回答中找到了如下方法:

    // case1: T* can cast to C*
    template <template <typename...> class C, typename...Ts>
    std::true_type is_base_of_template_impl(const C<Ts...>*); 
    // case2: T* cannot cast to C*
    template <template <typename...> class C>
    std::false_type is_base_of_template_impl(...);
    
    template <template <typename...> class C, typename T>
    using is_base_of_template = decltype(is_base_of_template_impl<C>(std::declval<T*>()));
    

    其中std::declval<T*>()是在不构造T*指针的情况下获得一个T*指针的引用类型,仅用于类型推断。这个方法利用的是派生类指针能够隐式转换为基类指针,基类C的模板参数则被参数包Ts...捕获,因此支持任意数量的模板参数,而其缺陷是仅适用于 public 继承(protected 或者 private 继承的类指针无法转化为基类指针)。使用方法与std::is_base_of类似:

    is_base_of_template<Point, Dot<float>>::value; // true
    is_base_of_template<Point, Dot<double>>::value; // true
    is_base_of_template<Point, Plane<double>>::value; // false
    


    stackoverflow同一问题下@jenka 的回答提供了适用于 protected 继承的解决方法(其代码好像有点问题,@Anton Dyachenko的补充后才正常)。这个方法能用,但原理我目前还没看明白,先贴出代码吧:

    template <template <typename...> class BaseTemplate, typename Derived, typename TCheck = void>
    struct test_base_template;
    
    template <template <typename...> class BaseTemplate, typename Derived>
    using is_base_of_template = typename test_base_template<BaseTemplate, Derived>::is_base;
    
    //Derive - is a class. Let inherit from Derive, so it can cast to its protected parents
    template <template <typename...> class BaseTemplate, typename Derived>
    struct test_base_template<BaseTemplate, Derived, std::enable_if_t<std::is_class_v<Derived>>> : Derived {
        template <typename... T>
        static constexpr std::true_type test(BaseTemplate<T...>*);
        static constexpr std::false_type test(...);
        using is_base = decltype(test((Derived*)nullptr));
    };
    
    //Derive - is not a class, so it is always false_type
    template <template <typename...> class BaseTemplate, typename Derived>
    struct test_base_template<BaseTemplate, Derived, std::enable_if_t<!std::is_class_v<Derived>>> {
        using is_base = std::false_type;
    };
    
    展开全文
  • https://www.cnblogs.com/snaildev/archive/2017/10/13/7661993.html
    展开全文
  • 官方文档:https://msdn.microsoft.com/zh-cn/library/system.type.isassignablefrom.aspx
    展开全文
  • 在Java中我们判断一个类是否是另外一个类的实例对象通常使用instanceof a instanceof B 另外我们还有一个方法是asSubclass,它将一个类转换成另外一个的实例,如果转换异常就会抛出ClassCastException异常,也...

    在Java中我们判断一个类是否是另外一个类的实例对象通常使用instanceof

    a instanceof B

    另外我们还有一个方法是asSubclass,它将一个类转换成另外一个的实例,如果转换异常就会抛出ClassCastException异常,也就是这个类不是另外一个类的实例;所以我们可以通过它抛出异常的方式来判断一个类是否是另外一个类的实例;

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Teacher {
    
        public static void main(String[] args) {
    
            Class<?> clazz = B.class;
            String name = clazz.getName();
            try {
                Class classA = clazz.asSubclass(A.class);
            } catch (ClassCastException e) {
                System.out.println(name+"不是类StopThread的子类");
            }
        }
    }
    展开全文
  • 定义三个类,关系如下 class A {} class B extends A {} class C extends B {} 测试三方法instanceof、isInstance、isAssignableFrom 测试代码如下 A a = new C(); B b = new C(); C c = new C(); ...
  • 之前在 intellij idea常用快捷键 里面说到过,Ctrl+o快捷键,可以快速打开当前的基类(父类),父类比较多的时候只能一层一层的打开,不太直观,使用下面的方法可以非常直观的展示出一个类的所有父类关系图。...
  • def ischildof(obj, cls):  try:  for i in obj.__bases__:  if i is cls or isinstance(i, cls):  return True  for i in obj.__bases__:  if ischil
  • 而抽象在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象一个典型应用,假设某个项目的所有Servlet都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    而在Java小程序中,这个主类是一个继承自系统JApplet或Applet的子类。应用程序的主类不一定要求是public,但小程序的主类要求必须是public。主类是Java程序执行的入口点。 Java应用程序与小程序之间有那些差别...
  • 编写一个矩形Rect,继承Rect编写一个具有确定位置的矩形PlainRect,编写PlainRect的测试程序 按要求编写一个Java应用程序: (1)编写一个矩形Rect,包含: 两个protected属性:矩形的宽width;矩形的...
  • 首先你要知道自己为什么要用final,用final干什么! 6.8.2 final方法 之所以要使用final方法,可能是出于对两方面理由的考虑。...这是final的规定当你将final用于身上时,一个final是无法任何人继承的,那也就意
  • 我有一个模板memory_cl,我需要判断一个类是否为它的子类,怎么实现呢? 开始我问了度娘,在知乎上找到了答案 —>《如何判断一个类是否一个模板的实例?》 上面这个链接中给出了完整的答案:struct is_kind_...
  • js 判断一个对象是否属于某一

    万次阅读 2017-11-01 20:53:44
    typeof:typeof是一个一元运算符,返回结果是一个说明运算数类型的字符串。如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在)。 但 typeof 的能力有限,其对于...
  • 一、背景:有的时候需要动态判断一个类是否实现了某个接口或者继承了某个父类。其实java里面已经有方法了,只是平时用的机会很少,在此mark一下   二、上代码 import java.io.Serializable; public class ...
  • Java面试题大全(2020版)

    万次阅读 多人点赞 2019-11-26 11:59:06
    本套Java面试题大全,全的不再全,哈哈~ 、Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。 JRE:Java Runtime Environ...
  • /// 泛型 /// </summary> /// <typeparam name="TEntity"></typeparam> public interface IClass<TEntity> where TEntity : class { } public class Entity { } public ...
  • 需求:当前有一个数据队列,要求该数据队列中的所有对象必须是实现了IObjGroup的类型,如果哪个对象不满足,就输出出来。 public interface IObjGroup&lt;T&gt;{} public class PeopleManager : ...
  • 简单方式查看继承关系

    千次阅读 2019-02-28 14:50:00
    使用IntelliJ IDEA的diagram查看继承关系图形,结果一目了然,也是好用到炸裂,mark一下。 1、查看图形形式的继承链 在你想查看的的标签页内,点击右键,选择 Diagrams,其中有 show 和 show ... Popup,...
  • .NET(C#):判断Type继承关系

    千次阅读 2016-11-11 14:14:11
    //判断对象是否是指定类型 //类型可以是父类,接口 //用法:父类.IsInstanceOfType(子类对象) bool IsAssignableFrom(Type) //判断类型的关系 //类型可以是父类,接口 //用法:父类....
  • dynamic_cast用于将一个父类对象的指针转换为子对象的指针或引用(动态转换) 向上转型:子类对象指针->父类指针/引用(不需要转换) 向下转型:父类对象指针->子类指针/引用(用dynamic_cast转型是安全的) 1 ...
  • * 判断一个类是JAVA类型还是用户定义类型 * @param clz * @return */ public static boolean isJavaClass(Class&lt;?&gt; clz) { return clz != null &amp;&amp; clz.getClassLoader()...
  • ES6以及继承的实现原理

    千次阅读 2019-05-12 21:47:06
    ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已, ES6中类实际上也是函数,我们使用typeof去判断类时可以看到其...
  • instancesrespondToSelector 是什么...instancesRespondToSelector是指的实例们是否能响应某一个方法(操作),respondsToSelector是指类是否能响应某一方法(对象) 举例: instancesRespondToSelector:
  • 解释:子类如果能继承父类,如果多父类中存在同名属性或者方法,子类继承时将不能判断继承自哪个父类的属性和方法,所以之间不能多继承。 接口之间可以多继承 解释:接口中的属性都是静态常量,不能被继承...
  • 本来要判断一个类的类型是否是List,用Obj.getClass()==List.class对付一下,结果其实传过来的Object是List的实现ArrayList(也只能是List的实现)。这就很奇怪了,如果用ArrayList.class又感觉太妥协了。 就写...
  • 如果 c 参数和当前的 Type 表示同一类型,或者如果当前的 Type 处在 c 的继承层次结构中,或者如果当前的 Type 是 c 所支持的接口,则为 true。如果这些条件都不成立,或者如果 c 为空引用,则为 false。
  • Java 判断一个对象中某一个属性是否为空 每次写博客都不知道咋开头…算了^_^ 直接说问题吧。就是验证一个对象中的一个属性的值是否为空。 自己在网上也找到了很多大神给的答案,有看到利用反射机制 public ...
  • C#判断Type继承关系

    千次阅读 2016-11-11 14:16:17
    //Type的函数 ... //判断对象是否是指定类型 //类型可以是父类,接口 //用法:父类.IsInstanceOfType(子类对象) bool IsAssignableFrom(Type) //判断类型的关系 //类型可以是父类,
  • 可能的情况有:从一个类继承,从一个或多个接口继承,从一个类和一个或多个接口继承。 使用Type类的BaseType属性来取得类从哪个类继承。GetInterfaces方法来取得类都实现了哪些接口。 测试代码如下: 类库代码: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 550,915
精华内容 220,366
关键字:

如何判断一个类是否能被继承